我的表现层与模型层不匹配,即使我没有动画。

4
在 iPhone 上,我有一个通过核心动画进行动画处理的 CALayer。然后在某个时候我更改了视图控制器。然后我返回到具有 CALayer 的视图控制器中,在 viewWillAppear: 中,我设置了我的图层的 frame 和 position 属性,将其移回到起始点。
设置这些属性会更改模型层,但演示层仍具有旧值,并且其演示层直到下一次播放动画才会更新。
在 CA 编程指南中,它说:
“您可以在动画事务正在处理时查询 CALayer 的实例以获取其相应的演示层。”
对我来说,这意味着演示层在动画期间应该与模型层不同。但当前没有任何正在运行的动画。我甚至使用了 kCATransactionDisableActions 来确保当我设置位置属性时不会启动隐式动画。
有人知道为什么我的演示层和模型层不同步吗?
谢谢。
2个回答

1
一个我使用过的解决方法是在 viewWillDisappear 中重置我的图层位置。此外,我注意到如果我不立即对图层进行动画处理,则它确实会移动到我在 viewWillAppear 中设置的位置。

2
一般的问题是,如果我在动画后设置位置,它只会影响模型层。有没有办法强制表示层“追上”模型层? - Kevin McCullough
老问题了,但这是对我有效的解决方案(至少在iOS 15上有效,因为似乎每年都有一些苹果人搞砸了这个领域)。在动画完成后,在图层中调用以下内容:在模型层和呈现层上都使用setValue(targetValue, forKeyPath: keyPath)。 - jason d

1
似乎苹果只在动画期间使用演示层,并对其进行懒惰更新。当不进行动画时,它必须使用常规层。我的唯一猜测是这是他们管理UI并避免奇怪错误的方法。甚至可能与使用哪些线程有关。
您的问题让我们了解到苹果的内部情况,也许答案就是苹果选择的那样,这也回答了我之前的一个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接