汽车(注释)animation(如超级应用程序)无法正常工作

我做了一个演示项目(从github上的Moving-MKAnnotationView演示)在地图上移动汽车以下是它的链接

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

我在vinaut的给定答案的基础上编辑我的代码,但仍然存在的问题是,当我们缩放或滚动地图animation在ios 7和ios 6中获取分散注意力时,我们缩放或滚动地图注释集合到原始angular度一段时间。

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

在这里输入图像说明

这是我改变的一些代码

- (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; } 

我的目标是像超级应用程序一样移动汽车。

似乎有些东西随着CLCoordinate2D / MKMapPoint / CGPoint的转换函数而改变…

检测到一个MKPolygon的一个点打破了iOS7(CGPathContainsPoint)

注释消失了,因为MkMapPoints和CGIPoints之间的转换不再起作用了,如果你loggingCALayer的“位置”,你将会看到点的方式。 不知道为什么它在做触摸事件时工作。

如果您将该function更改为:

  - (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; } 

它应该再次工作。

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

在缩放/滚动地图时分散汽车的问题。 实际上,通过添加animation注释是无法实现的。 我已经find了Interpolate函数,通过它我可以获取“From”和“To”坐标之间的位置并将其设置为注释(以毫秒为单位的设置注释坐标)将看起来像animation。

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