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

从iOS 11开始,当我在自定义MKAnnotationView中使用set
Image时,图像会显示动画.

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

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

最佳答案 看到这是我在过去一年半中在任何地方找到的这个问题(特征?)的唯一提及,让我首先感谢你是我唯一的理智来源.有了这个,我终于能够回过头来解开这个……我还没有提交雷达,只是因为不清楚这种行为是否有意.无论正确的行为是什么,动画都有一些奇怪的副作用,并导致我达到
report a separate issue.

问题

为了将其缩小,图像字段不是可动画字段,但是在用户定义的事务之外更新它会触发系统执行的从前一图像到新图像的路径动画.由于动画是在图层级别执行的,因此UIKit将无法阻止它们.相反,我们必须完全停止当前线程事务的动画操作,以便永远不允许执行嵌套层动画:

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

修改现有动画

您可以通过将自己的属性注入当前线程事务来解除路径动画,而不是完全切断动画.但是,这里的问题是,为了正确地制作路径和动画.使图像不移动的外观(例如,从小针到大针的动画),我们必须同步centerOffset的附加动画.此字段不直接修改图层,但它看起来确实是一个UIKit动画字段.这意味着您需要将UIKit动画与CoreAnimation事务组合在一起:

CATransaction.begin()
CATransaction.setAnimationDuration(animationDuration)
CATransaction.setAnimationTimingFunction(CAMediaTimingFunction(name: .easeIn))

UIView.animate(withDuration: animationDuration, delay: 0, options: .curveEaseIn, animations: {
    self.image = newImage
    self.centerOffset = newCenterOffset
}, completion: nil)

CATransaction.commit()

持续时间& UIKit动画和放大器的定时功能必须相同. CoreAnimation事务.

点赞