观察 UIViewPropertyAnimator 正在运行问题

Posted

技术标签:

【中文标题】观察 UIViewPropertyAnimator 正在运行问题【英文标题】:Observing UIViewPropertyAnimator is running issue 【发布时间】:2018-04-24 08:13:25 【问题描述】:

来自 Apple 文档pausesoncompletion

因为当此属性为 true 时不会调用完成处理程序,所以您不能使用动画制作者的完成处理程序来确定动画何时完成运行。 相反,您可以通过观察 isRunning 属性来确定动画何时结束。

但我发现观察 isRunning 不起作用。 util我看了WWDC 2017 - Session 230-Advanced Animations with UIKit,我知道我应该观察running

//not work
animator.addObserver(self, forKeyPath: "isRunning", options: [.new], context: nil)
//this work
animator.addObserver(self, forKeyPath: "running", options: [.new], context: nil)

我的问题是:我在哪里可以找到 excatly 密钥路径,不仅是这种情况。谢谢~

【问题讨论】:

【参考方案1】:

在 Swift 中,建议使用基于块的 KVO API(从 Swift 4 开始可用),它允许您以类型安全和编译时检查的方式观察属性:

// deinit or invalidate the returned observation token to stop observing
let observationToken = animator.observe(\.isRunning)  animator, change in
    // Check `change.newValue` for the new (optional) value

请注意,关键路径是\.isRunning,因为在Swift 中UIViewPropertyAnimator 上的属性称为isRunning

这两者的好处是您不必知道给定属性的字符串是如何拼写的,并且更改后的值与观察到的属性具有相同的类型。


请注意,在 Objective-C 中此 API 不可用,因此the corresponding Objective-C documentation 要求您观察“运行”属性。这是因为在 Objective-C 中,该属性称为“running”(但有一个称为“isRunning”的 getter)。

【讨论】:

以上是关于观察 UIViewPropertyAnimator 正在运行问题的主要内容,如果未能解决你的问题,请参考以下文章

扩展 UIViewPropertyAnimator?

为啥在 UIViewPropertyAnimator 中使用“unowned”

UIViewPropertyAnimator 的反弹效果

完成块内的 UIViewPropertyAnimator 状态?

NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失

UIViewPropertyAnimator 开头有短动画片段