如何在OSX上为基于MKAnnotation的注释的坐标属性设置动画?

时间:2015-06-27 13:40:42

标签: macos animation mapkit mkannotation

使用以下方法在iOS上动画注释的坐标非常容易:

[UIView animateWithDuration:1.0f
                 animations:^(void){
                     annotation.coordinate = ...
                 }
                 completion:^(BOOL finished)completion{
                     NSLog(@"Animation complete");
                 }

然而,OSX等效方法+[NSAnimationContext runAnimationGroup:]对我不起作用 - 注释跳转到新位置并立即调用完成处理程序,即它不会按预期持续10秒:

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = 10;

    annotation.coordinate = destination;
} completionHandler:^{
    NSLog(@"Animation complete");
}];

我是OSX的新手,这就是为什么我猜我错过了一些简单的东西来制作这个动画。我猜测@coordinate属性在OSX MKMapView的注释中是不可动画的,但这会对iOS和OSX上MapKit的实现产生一个非常奇怪的区别。

我创建simple test application来隔离此问题。

2 个答案:

答案 0 :(得分:1)

问题解决了。我需要在代码中添加allowsImplicitAnimation = YES

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
    context.duration = 10;
    context.allowsImplicitAnimation = YES;

    annotation.coordinate = destination;
} completionHandler:^{
    NSLog(@"Animation complete");
}];

我在WWDC会话的屏幕截图中找到了这个提示:Cocoa: run block after animation on OSX

答案 1 :(得分:0)

感谢@Stanislav,allowImplicitAnimation对我来说也是缺失的关键。作为参考,这是我的 Swift 4.1 代码,用于为自定义持续时间的MKMapView制作动画:

extension MKMapView {
    func animateTo(region: MKCoordinateRegion, duration: TimeInterval) {
        NSAnimationContext.current.allowsImplicitAnimation = true
        NSAnimationContext.current.duration = duration

        NSAnimationContext.runAnimationGroup({ _ in
            self.setRegion(region, animated: true)
        }, completionHandler:{
            print("Animation complete.")
        })
    }
}