25

我制作了一个演示项目(来自 github 上的 Moving-MKAnnotationView 演示),用于在地图上移动汽车,下面是它的链接

https://github.com/pratikbhiyani/Moving-MKAnnotationView

我根据 vinaut 给出的答案编辑了我的代码,但问题仍然是,当我们缩放或滚动地图动画时,在 ios 7 和 ios 6 中,当我们将地图注释集缩放或滚动到其原始角度一段时间时会分散注意力.

下面是我的演示项目的屏幕截图

在此处输入图像描述

这是我更改的一些代码

- (void) setPosition : (id) posValue;
{
    NSLog(@"set position");

    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];

    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);
    CGPoint toPos;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];
    }
    else
    {
        CGFloat zoomFactor =  self.mapView.visibleMapRect.size.width / self.mapView.bounds.size.width;
        toPos.x = mapPoint.x/zoomFactor;
        toPos.y = mapPoint.y/zoomFactor;
    }



    [self setTransform:CGAffineTransformMakeRotation([self getHeadingForDirectionFromCoordinate:MKCoordinateForMapPoint(previousPoint) toCoordinate: MKCoordinateForMapPoint(mapPoint)])];

    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];
        animation.duration = 1.0;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }

    self.center = toPos;

    previousPoint = mapPoint;
}

我的目标是像在 uber 应用程序中一样移动汽车。

4

3 回答 3

14

CLCoordinate2D/MKMapPoint/CGPoint 的转换函数似乎发生了一些变化......

检测 MKPolygon 中的一个点与 iOS7 (CGPathContainsPoint) 冲突

注释消失了,因为 MkMapPoints 和 CGI​​Points 之间的转换不再起作用,如果您记录 CALayer 的“位置”,您将获得视图之外的点。不知道为什么它在进行触摸事件时起作用。

如果您将功能更改为:

    - (void) setPosition : (id) posValue; 
{
    //extract the mapPoint from this dummy (wrapper) CGPoint struct
    MKMapPoint mapPoint = *(MKMapPoint*)[(NSValue*)posValue pointerValue];  
    CLLocationCoordinate2D coord = MKCoordinateForMapPoint(mapPoint);

    CGPoint toPos = [self.mapView convertCoordinate:coord toPointToView:self.mapView];


    if (MKMapRectContainsPoint(self.mapView.visibleMapRect, mapPoint)) {

        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];

        animation.fromValue = [NSValue valueWithCGPoint:self.center];
        animation.toValue = [NSValue valueWithCGPoint:toPos];   
        animation.duration = 0.8;
        animation.delegate = self;
        animation.fillMode = kCAFillModeForwards;
        //[self.layer removeAllAnimations];
        [self.layer addAnimation:animation forKey:POSITIONKEY];

        //NSLog(@"setPosition ANIMATED %x from (%f, %f) to (%f, %f)", self, self.center.x, self.center.y, toPos.x, toPos.y);
    }   

    self.center = toPos;


}

它应该再次工作。

于 2013-10-11T19:47:15.113 回答
14

我是 Moving-MKAnnotationView ( https://github.com/100grams/Moving-MKAnnotationView.git ) 的原始贡献者。该组件最初是使用 iOS4.3 编写的,此后发生了很多变化。:-)

这里的根本原因是从 MKMapPoint 到 CGPoint(屏幕坐标)的转换。虽然代码之前工作过,但它在 iOS7 上中断了,我通过使用它将纬度/经度坐标转换为屏幕坐标来修复它:

convertCoordinate:toPointToView:

我已经将此修复以及其他一些更新提交到https://github.com/100grams/Moving-MKAnnotationView.git,因此它现在可以在 iOS7/Xcode5 上运行。

于 2013-10-22T15:57:59.053 回答
1

缩放/滚动地图时分散汽车注意力的问题。实际上它不能通过在注解中添加动画来实现。我发现了Interpolate 函数,通过它我可以获得“From”和“To”坐标之间的位置并将其设置为注释(以毫秒为单位设置注释坐标)看起来像动画。

这不是 iOS 或地图的问题,如果您向注释添加动画,它将添加到注释层而不是地图点。

于 2015-05-03T05:32:04.183 回答