有没有办法在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通知。
我最终做的是设置一个计时器,它运行在一个非常小的时间间隔内,并重复查询UIViewPropertyAnimator
的fractionComplete
属性,并在滑动过程中更新滑块。 它可行,但这不是一个很干净的做事方式。 如果有办法获得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),但我希望有一个更好的方法。