暂停时调用 UIViewPropertyAnimator 完成

Posted

技术标签:

【中文标题】暂停时调用 UIViewPropertyAnimator 完成【英文标题】:UIViewPropertyAnimator completion called when paused 【发布时间】:2019-01-16 23:41:30 【问题描述】:

我没有经常使用UIViewPropertyAnimator(仍然是一个老式的积木人)并且我看到了一些我无法解释的行为并且文档并没有真正提供任何见解。

为什么动画师的完成块会被 finalPosition.end 调用,即使动画师在启动后立即暂停?

let view = UIView()
let animator = UIViewPropertyAnimator(duration: 4, curve: .linear, animations: 
    view.alpha = 0
)

animator.addCompletion  position in
    print("done")
    switch position 
    case .start: print("start")
    case .current: print("current")
    case .end: print("end")
    


animator.startAnimation()
print("starting")
animator.pauseAnimation()
print("pausing")

输出:

starting
pausing
done
end

【问题讨论】:

Session 216 from WWDC 216 和 Session 230 from WWDC 2017 如果您开始与属性动画师一起玩,两个小时的时间非常值得。非常好的介绍。 感谢您提供的链接——这两个我过去都看过,会再试一次。 【参考方案1】:

正如@matt 所暗示的,问题在于您的视图不在可见的UIWindow 中,因此动画会立即完成。如果您注释掉 animator.pauseAnimation() 语句,您将得到相同的输出。

如果您使用游乐场,您可以通过将游乐场页面的view 设为liveView 来解决此问题:

import PlaygroundSupport
import UIKit

let view = UIView()
PlaygroundPage.current.liveView = view

// etc.

【讨论】:

【参考方案2】:

如果您从 Apple 的开发者网站阅读了 addCompletion 的文档, 其中一个参数是finalPosition。您可以使用该值来确定 动画是在开头、结尾还是中间某个地方停止。 并且调用 pauseAnimation 将触发该完成块,其中某个位置在中间位置。

参数完成 动画完成时执行的块。 该块没有返回值,并采用以下参数:

finalPosition 动画的结束位置。使用此值 确定动画是否在开始、结束或 中间的某个地方。

【讨论】:

这就是我的想法,但是为什么要在startAnimation() 之后立即调用pauseAnimation() 调用完成时使用finalPosition.end 我假设 startAnimation 是一个异步函数,所以如果您在此之后立即调用 pauseAnimation ,那么它将立即触发完成。如果将通过用户事件触发器调用 pauseAnimation,那么我想你会得到不同的结果。

以上是关于暂停时调用 UIViewPropertyAnimator 完成的主要内容,如果未能解决你的问题,请参考以下文章

调试停止时调用函数

当我的 UIViewController 被弹出时调用的方法?

我可以暂停和恢复的线程?

Activity横竖屏切换生命周期变化

android生命周期

安卓开发 Activity入门