iOS 11 上的 MKAnnotationView setImage() 有动画

Posted

技术标签:

【中文标题】iOS 11 上的 MKAnnotationView setImage() 有动画【英文标题】:MKAnnotationView setImage() on iOS 11 has an animation 【发布时间】:2018-04-03 20:04:54 【问题描述】:

ios 11 开始,当我在自定义 MKAnnotationView 中使用 setImage 时,图像会显示动画。

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

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

【问题讨论】:

我试过[UIView performWithoutAnimation:^],但不起作用。这个奇怪的动画真的很烦人。 【参考方案1】:

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

问题

归结起来,image 字段不是动画字段,但是在用户定义的事务之外更新它会触发系统执行的从前一个图像到新图像的路径动画图片。由于动画是在层级执行的,UIKit 将无法停止它们。相反,我们必须完全停止当前线程事务的动画动作,以便永远不允许执行嵌套层动画:

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

修改现有动画

除了完全切断动画之外,您还可以通过将自己的属性注入当前线程事务来消除路径动画。但是,这里的问题是,为了正确地为路径设置动画并让图像看起来没有移动(例如,从小针到大针的动画),我们必须同步 @ 的附加动画987654325@。这个字段确实not 直接修改了图层,但它看起来确实是一个 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 事务的持续时间和计时函数必须相同。

【讨论】:

在 iOS 15 上禁用 annotationView.image 动画似乎不再适用于 CATransaction.setDisableActions(true) @AleksanderMaj 我也看到了同样的情况。 CATransaction.setAnimationDuration(0.0) 似乎也有类似的效果。

以上是关于iOS 11 上的 MKAnnotationView setImage() 有动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11 上的 MKAnnotationView setImage() 有动画

iOS 布局在 Xcode 11 上的 iOS 13 上中断 - 未调用 traitCollectionDidChange

带有 AirPods 的 iOS11 上的 RemoteIO

Swift 3 - iOS 11.2 上的 UICollectionview 问题

iOS 11 上的静默推送未发送到应用程序

如何摆脱 UIScrollview 上的 safeAreaInsets(iOS 11,iPhoneX)