汽车(注释)动画(如 uber 应用程序)不起作用

Posted

技术标签:

【中文标题】汽车(注释)动画(如 uber 应用程序)不起作用【英文标题】:Car (Annotation) animation (like uber app) not working 【发布时间】:2013-10-16 13:53:36 【问题描述】:

我做了一个演示项目(来自 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 应用中一样移动汽车。

【问题讨论】:

那么问题出在哪里?当您移动地图时,您的注释会消失吗? 是的。并且它不像在 ios 6 中显示的那样显示流畅的动画; 尝试使用平移变换而不是重新定位... 你能发布你的动画代码吗?以及如何检测到汽车需要像在路边一样旋转? github.com/pratikbhiyani/Moving-MKAnnotationView 【参考方案1】:

CLCoordinate2D/MKMapPoint/CGPoint 的转换函数似乎有所改变...

Detecting a point in a MKPolygon broke with 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;



它应该又可以工作了。

【讨论】:

嘿,感谢您的回答,但您的代码的问题是地图移动时注释会分散路径。 我不知道它在 iOS 6 中应该如何表现。我指出了它没有显示注释的原因,你应该能够修改你认为合适的代码知道.例如,如果您不希望在平移或缩放时更新注释,只需拥有一个跟踪当前 mapView.visibleRect 的属性并将其与 setPosition 中的新值进行比较,如果动画已更改,则不要运行动画.试一试,如果你成功了,请告诉我。 在 ios 6 中,它不会在平移或缩放时分散路径。我无法停止动画。它负责平稳驾驶。 嘿朋友,你快回答了,所以 +50 给你 :) 嘿,很抱歉不接受您的回答,但我会在赏金完成后接受答案。【参考方案2】:

我是 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 上运行。

【讨论】:

感谢您的回复。它的演示非常好。但问题是当 theGroup.duration = 0.2 并且当我将持续时间增加到 1.0 以实现平滑动画时,注释会分散缩放或缩放地图时的路径。 是的,这确实是一个警告。我想你应该在地图被平移/缩放时中止/停止任何动画以避免这种副作用。 是的,我尝试使用删除动画,但不幸的是它显示了同样的干扰:( 您是否尝试隐藏移动的注释,即在地图平移/缩放时设置 alpha=0? 我想在地图上添加汽车并显示它们的运动,但问题是我从 api 获取汽车的位置。所以我想通过我所在的纬度和经度为汽车制作动画从那个 api 获取。我怎样才能做到这一点?任何帮助将不胜感激。【参考方案3】:

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

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

【讨论】:

以上是关于汽车(注释)动画(如 uber 应用程序)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Uber Api GET /我使用Curl不起作用

动画 UIView 宽度不起作用

翻译动画后 View.GONE 不起作用

资讯通用汽车与Uber合作 将Maven汽车共享引入澳大利亚

Hibernate @Column 注释不起作用

为啥这个简单的动画在 iOS 7 上不起作用?