如何在 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.")
})
}
}
使用以下方法很容易在 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.")
})
}
}