如何正确地动画地图注释动画?

时间:2014-09-07 19:22:40

标签: ios iphone animation ios7 map

我在MKMapView显示城市公交车的实时位置。我的应用程序以特定间隔轮询位置并在地图上更新它们。我试图动画地图注释的动作。

我已使用this stackoverflow answer中的以下代码成功制作动画:

- (void)moveBusAnnotation:(TKLBus*)bus coordinate:(CLLocationCoordinate2D)coordinate {
    [UIView animateWithDuration:0.5f
    animations:^(void){
        bus.annotation.coordinate = coordinate;
    }];
}

问题是,当用户在播放动画时平移或缩放地图时,注释的运动路径看起来很奇怪且有问题。这是一个演示:

map annotation animation

注意地图注释如何遵循奇怪的曲线而不是直线。 模拟公交车的运动,忽略它在地图上的奇怪位置。

如何在平移/缩放地图时让动画看起来更自然或停止制作动画?

编辑:动画似乎做对了。它看起来很奇怪,因为地图注释的下一个坐标在动画播放时正在移动。我认为解决方案是在用户触摸屏幕时阻止动画。

1 个答案:

答案 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;
                     }];
}