有没有办法在UIViewPropertyAnimator中观察对fractionComplete的更改

我一直在iOS 10中查看非常酷的新UIViewPropertyAnimator类。它可以让你轻松地做些事情,如暂停,恢复和反向的飞行UIViewanimation。 它曾经是,你必须操纵系统创build的底层CAAnimations为了做到这一点与UIViewanimation。

新的UIViewPropertyAnimator类有一个属性fractionComplete 。 它从0.0(animation开始)到1.0(animation结束)变化。如果更改值,则可以从头到尾“擦除”animation。

我有一个名为KeyframeViewAnimations的 Github上的演示项目,它允许您使用滑块来使用相当神秘的CAAnimation技巧来擦除UIView和CAAnimations。 当animation运行时,滑块从头到尾移动以显示animation的进度。 该项目是在Swift发布之前用Objective-C编写的,但Objective-C或Swift中的基础技术是相同的。

我决定使用UIViewPropertyAnimator创build一个等价的项目。 有一些怪癖,但是相当简单。 有一件事情我不知道如何干净地做,是观察animation的fractionComplete属性的进展,以便我可以更新滑块随着animation的进展。 我尝试在fractionComplete属性上设置KVO(键值观察),但是在animation完成之前它不会触发KVO通知。

我最终做的是设置一个计时器,它运行在一个非常小的时间间隔内,并重复查询UIViewPropertyAnimatorfractionComplete属性,并在滑动过程中更新滑块。 它可行,但这不是一个很干净的做事方式。 如果有办法获得animation进展的通知,情况会好得多。

我希望有一些我错过了。

你可以在这个链接上看到Github上基于UIViewPropertyAnimator的项目: UIViewPropertyAnimator-test

从animation器获取进度值的代码是这样的代码:

 func startTimer(_ start: Bool) { if start { timer = Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) { timer in var value = Float(self.viewAnimator.fractionComplete) if self.animatingBackwards { value = 1 - value } self.animationSlider.value = value } } else { self.timer?.invalidate() } } 

我应该可能转换上面的代码使用CADisplayLink计时器,而不是香草计时器(NSTimer),但我希望有一个更好的方法。