使用以下方法在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来隔离此问题。
答案 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.")
})
}
}