我在MKMapView
显示城市公交车的实时位置。我的应用程序以特定间隔轮询位置并在地图上更新它们。我试图动画地图注释的动作。
我已使用this stackoverflow answer中的以下代码成功制作动画:
- (void)moveBusAnnotation:(TKLBus*)bus coordinate:(CLLocationCoordinate2D)coordinate {
[UIView animateWithDuration:0.5f
animations:^(void){
bus.annotation.coordinate = coordinate;
}];
}
问题是,当用户在播放动画时平移或缩放地图时,注释的运动路径看起来很奇怪且有问题。这是一个演示:
注意地图注释如何遵循奇怪的曲线而不是直线。 模拟公交车的运动,忽略它在地图上的奇怪位置。
如何在平移/缩放地图时让动画看起来更自然或停止制作动画?
编辑:动画似乎做对了。它看起来很奇怪,因为地图注释的下一个坐标在动画播放时正在移动。我认为解决方案是在用户触摸屏幕时阻止动画。
答案 0 :(得分:1)
试试这个:
设置一个bool,表明用户正在使用地图:
@property (nonatomic, assign) BOOL userIsInteracting;
然后检查地图中的用户触摸:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
for (UITouch * touch in touches)
{
CGPoint loc = [touch locationInView:_mapView];
if ([_mapView pointInside:loc withEvent:event])
{
_userIsInteracting = YES;
break;
}
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesEnded:touches withEvent:event];
for (UITouch * touch in touches)
{
CGPoint loc = [touch locationInView:_mapView];
if ([_mapView pointInside:loc withEvent:event])
{
_userIsInteracting = NO;
break;
}
}
}
现在您知道何时为地图中的位置设置动画:
- (void)moveBusAnnotation:(TKLBus*)bus coordinate:(CLLocationCoordinate2D)coordinate
{
if (_userIsInteracting) return;
[UIView animateWithDuration:0.5f
animations:^(void){
bus.annotation.coordinate = coordinate;
}];
}