gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:56:32 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

问题

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

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

修改现有动画

除了完全切断动画之外,您还可以通过将自己的属性注入(inject)当前线程事务来消除路径动画的卡顿。不过,这里的问题是,为了正确地为路径设置动画并使图像看起来没有移动(例如,从一个小图钉动画到一个大图钉),我们必须同步 中心偏移量。该字段直接修改图层,但它看起来确实是一个 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 - iOS 11 上的 MKAnnotationView setImage() 有一个动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46886566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com