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

How to animate coordinate property of MKAnnotation-based annotation on OSX?

使用以下方法很容易在 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 来隔离这个问题。

问题已解决。我需要将 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

谢谢@Stanislav,allowsImplicitAnimation 也是我缺少的关键。作为参考,这是我的 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.")
        })
    }
}