在Swift中动画MapKit注释坐标变化?

时间:2021-08-11 21:17:14

When using MapKit in iOS 8 in Swift, how do I make it possible to animate a change in the map position of a custom annotation? I am saying this:

在Swift的iOS 8中使用MapKit时,如何设置自定义注释的地图位置变化的动画?我这样说:

UIView.animateWithDuration(0.25) {
    var loc = ann.coordinate
    loc.latitude = loc.latitude + 0.0005
    loc.longitude = loc.longitude + 0.001
    ann.coordinate = loc
}

...where ann is a custom annotation, MyAnnotation. The annotation is jumping, not animating, to the new coordinate position.

...其中ann是自定义注释,MyAnnotation。注释是跳跃而不是动画,到新的坐标位置。

The annoying thing is that the animation works perfectly if I write MyAnnotation in Objective-C. But if I write it in Swift, I don't get the animation any more!

令人讨厌的是,如果我在Objective-C中编写MyAnnotation,动画效果很好。但是如果我在Swift中写它,我就不再动画了!

Just FYI, here is my Swift code for MyAnnotation:

仅供参考,这是我的MyAnnotation的Swift代码:

class MyAnnotation : NSObject, MKAnnotation {
    var coordinate : CLLocationCoordinate2D
    var title: String!
    var subtitle: String!

    init(location coord:CLLocationCoordinate2D) {
        self.coordinate = coord
        super.init()
    }
}

1 个解决方案

#1


55  

You almost have it right! Just change this line in your MyAnnotation implementation:

你几乎把它弄好了!只需在MyAnnotation实现中更改此行:

var coordinate : CLLocationCoordinate2D

to this:

对此:

dynamic var coordinate : CLLocationCoordinate2D

That will fix it.

这将解决它。

Why does this matter? Because annotation animation relies on KVO (key value observing). In Swift, a property is not key value observable unless it is marked as dynamic. (To get a little more technical, that in turn is because KVO observation works by swizzling the implementation of the property setter method - the runtime reaches right into your class and changes that property's setter code. But in Swift, it can't do that unless you explicitly mark the property as dynamic.)

为什么这很重要?因为注释动画依赖于KVO(键值观察)。在Swift中,属性不是可观察的键值,除非它被标记为动态。 (为了获得更多的技术,反过来是因为KVO观察通过调整属性setter方法的实现来工作 - 运行时到达你的类并更改该属性的setter代码。但是在Swift中,它无法做到这一点除非您明确将该属性标记为动态。)

#1


55  

You almost have it right! Just change this line in your MyAnnotation implementation:

你几乎把它弄好了!只需在MyAnnotation实现中更改此行:

var coordinate : CLLocationCoordinate2D

to this:

对此:

dynamic var coordinate : CLLocationCoordinate2D

That will fix it.

这将解决它。

Why does this matter? Because annotation animation relies on KVO (key value observing). In Swift, a property is not key value observable unless it is marked as dynamic. (To get a little more technical, that in turn is because KVO observation works by swizzling the implementation of the property setter method - the runtime reaches right into your class and changes that property's setter code. But in Swift, it can't do that unless you explicitly mark the property as dynamic.)

为什么这很重要?因为注释动画依赖于KVO(键值观察)。在Swift中,属性不是可观察的键值,除非它被标记为动态。 (为了获得更多的技术,反过来是因为KVO观察通过调整属性setter方法的实现来工作 - 运行时到达你的类并更改该属性的setter代码。但是在Swift中,它无法做到这一点除非您明确将该属性标记为动态。)