汽车(注释)动画(如 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 和 CGIPoints 之间的转换不再起作用,如果您记录 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 应用程序)不起作用的主要内容,如果未能解决你的问题,请参考以下文章