iOS 11上的MKAnnotationView setImage()有一个动画

时间:2017-10-23 09:58:26

标签: ios mkmapview mkannotationview

自iOS 11起,当我在自定义setImage中使用MKAnnotationView时,图像会以动画形式显示。

问题是当我选择并取消选择MKAnnotationView并且图像具有不同的大小时。这导致了一个奇怪的动画。

iOS 11之前没问题,我们可以阻止这种行为吗?

1 个答案:

答案 0 :(得分:2)

看到这是我在过去一年半中发现的所有问题(功能?)中唯一提及的一个问题,让我首先感谢您成为我唯一的理智来源。这样,我终于可以回过头来揭开这……的神秘面纱了。我尚未提起雷达,只是因为目前尚不清楚这种行为是否故意。无论正确的行为如何,动画都有一些奇怪的副作用,并导致我进入report a separate issue

问题

要精简起见,image字段是不可动画的字段,但是在用户定义的事务之外对其进行更新会触发系统执行的从前一张图片到新图像。由于动画是在图层级别执行的,因此UIKit将无法停止它们。相反,我们必须完全停止当前线程事务的动画动作,以使嵌套图层动画永远不能执行:

CATransaction.begin()
CATransaction.setDisableActions(true)
annotationView.image = newImage
CATransaction.commit()

修改现有动画

除了完全切断动画之外,您还可以通过将自己的属性注入当前线程事务来消除路径动画的混乱。不过,这里要注意的是,为了正确地设置路径动画和使图像看起来不动(例如,从小图钉到大图钉制作动画),我们必须同步{ {1}}。此字段确实centerOffset直接修改了图层,但是它看起来确实是UIKit可动画化的字段。这意味着您需要将UIKit动画与CoreAnimation事务相结合:

not

UIKit动画和CoreAnimation事务的持续时间和计时功能必须相同。