【问题标题】:iOS layer animation - explanationiOS 图层动画 - 解释
【发布时间】:2016-06-14 18:49:18
【问题描述】:
let flyRight = CABasicAnimation(keyPath: "position.x")
flyRight.toValue = view.bounds.size.width/2
flyRight.duration = 0.5
flyRight.fromValue = -view.bounds.size.width/2
flyRight.fillMode = kCAFillModeBoth
flyRight.beginTime = CACurrentMediaTime() + 3.4
password.layer.position.x = view.bounds.size.width/2
password.layer.addAnimation(flyRight, forKey: nil)

我的问题是:怎么可能在我添加动画之前,我首先将图层放在结束位置,但是当应用程序启动时,我在动画开始之前看不到它?相反,动画在 3.4 秒后按预期工作。

我的意思是,iOS 怎么知道它首先需要运行动画,然后才将图层放到它的最终位置?

【问题讨论】:

    标签: ios swift core-animation


    【解决方案1】:

    这是因为有presentationLayermodelLayer所以动画显示和修改presentationLayer,所以presentationLayer就像鬼一样。

    您可能知道 UIView 实例以及支持层的 NSView 会修改其层以将渲染委托给强大的核心 动画框架。但是,重要的是要了解 动画,当添加到图层时,不要修改其属性 直接地。 相反,Core Animation 维护了两个并行的层级结构:模型层树和表示层树。 前者中的层反映了众所周知的层状态,而后者中只有层近似于飞行中的值 动画。 考虑向视图添加淡出动画。如果您在动画期间的任何时候检查图层的不透明度值,您 很可能不会得到与屏幕上的内容相对应的不透明度。 相反,您需要检查表示层以获得正确的 结果。 虽然您可能无法直接设置表示层的属性,但使用其当前值创建新的可能很有用 动画或在动画拍摄时与图层交互 地方。 通过使用 -[CALayer presentationLayer] 和 -[CALayer modelLayer],您可以轻松地在两个层级之间切换。

    你可以在这里找到更多信息https://www.objc.io/issues/12-animations/animations-explained/

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      这与应用 UI 更改的方式有关。当您对 UI 对象进行更改时,在您的代码返回并且事件循环运行之前,该更改不会呈现到屏幕上。

      当这种情况发生时,系统会将您的视图移动到其最终位置,但随后 ACTUAL 视图/层层次结构会被绘制在顶部的新层覆盖,称为表示层。表示层是动画中的像素出现在屏幕上的地方。这就是你所看到的。

      动画结束时,表示层被隐藏/移除(不确定是哪个)并显示实际层内容。此时图层处于其最终位置,所以一切看起来都是正确的。

      【讨论】:

      • 因此对 UI 对象的更改不会立即呈现。知道了。不过,我不明白代码返回时幕后会发生什么?视图应该放置在它的最终位置,只有 3.4 秒后我应该看到它开始动画。在动画运行之前隐藏了什么?表现层只在动画运行时有效,怎么覆盖视图的模型层呢?
      • 这是否与我使用 fillMode = kCAFillModeBoth 的事实有关?这使得动画的第一帧 apeear 无论动画何时开始/
      • 所以,如果我理解正确的话,动画视图被表示层覆盖,因此无法响应任何触摸,对吗?在动画完成之前,动画视图不会响应触摸,并且位于响应者链之外。对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多