【问题标题】:Observe progress of UIView.animateWithDuration/CABasicAnimation?观察 UIView.animateWithDuration/CABasicAnimation 的进度?
【发布时间】:2016-07-21 09:27:22
【问题描述】:

有没有办法观察 UIView.animateWithDuration 的“时间进度”...来自 UIView / 或者 CA 动画的方法系列?

我正在为视图的框架设置动画,我需要了解它的进展情况。 我的想法是我可以要么

1) 使用 CAAnimation 相关的东西或

2) 观察动画属性(如帧)并自己计算每个屏幕帧。

方法 1) 结果证明是一条死胡同,检查 CAAnimations 的内部工作原理并没有告诉我什么……而且 2) 存在缺陷,因为“模型层树会立即更新,并且很难利用表示树因为当你开始的时候表现层是零。

我非常绝望,我认为连接到 CADisplayLink 会给我一个标记,然后我只是检查受动画影响但没有什么可以点击的东西。 您认为采用与动画方法在同一范围内启动的 NSTimer 方式可以吗?如果我知道动画持续时间,那么我可以自己生成进度。

【问题讨论】:

标签: ios animation uiview


【解决方案1】:

如果您想要的只是时间值,那么您可以对 CACurrentMediaTime() 减去动画开始时间进行数学运算。我在 Github 上有一个名为 KeyframeViewAnimations 的示例项目,它就是这样做的。

该项目支持暂停、恢复和擦除基于UIViewCAAnimation 的动画。在这两种情况下,它都会挖掘底层的CAAnimations

我有另一个项目,它使用动画层的presentationLayer 的值来进行命中测试,这样您就可以点击飞行中的视图并开始/暂停动画。可以在这里找到那个: iOS-CAAnimation-group-demo

我的代码使用NSTimer 来更新动画的进度。正如您所提到的,最好使用CADisplayLink 计时器。

我还在研究添加到 iOS 10 中的新 UIViewPropertyAnimator 类。这使得暂停、反转和擦除 UIView 动画变得容易,而无需深入研究底层的 CAAnimations。请参阅我刚刚发布的此主题:

Is there a way to observe changes to fractionComplete in UIViewPropertyAnimator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2023-04-02
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多