我一直在关注iOS 10中非常酷的新UIViewPropertyAnimator
课程。它可以让您轻松执行暂停,恢复和反向飞行UIView动画等操作。过去,您必须操纵系统创建的基础CAAnimations,以便使用UIView动画执行此操作。
新的fractionComplete
类有一个属性UIViewPropertyAnimator
。它从0.0(动画开始)到1.0(动画结束)不等。如果更改了值,则可以从头到尾“擦除”动画。
我在Github上有一个名为KeyframeViewAnimations的演示项目,它允许你使用滑块来使用相当神秘的CAAnimation技巧来回擦洗UIView和CAAnimations。当动画运行时,滑块从头到尾移动以显示动画的进度。该项目是在Swift发布之前用Objective-C编写的,但Objective-C或Swift中的基础技术是相同的。
我决定使用fractionComplete
创建一个等效项目。有一些怪癖,但它相当简单。我无法弄清楚如何干净利落的一件事是观察动画的fractionComplete
属性的进度,以便我可以随着动画的进展更新滑块。我尝试在UIViewPropertyAnimator
属性上设置KVO(键值观察),但在动画完成之前它不会触发KVO通知。
我最终要做的是设置一个在很短的时间间隔内运行的计时器,并反复查询fractionComplete
的{{1}}属性,并在滑块前进时更新它。它有效,但它不是一种非常干净的做事方式。如果有办法获得有关动画进展的通知,情况会好得多。
我希望有一些我不知道的东西。
您可以在此链接上看到基于UIViewPropertyAnimator
的Github项目:UIViewPropertyAnimator-test。
从动画师获取进度值的代码是以下代码:
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
计时器而不是vanilla计时器(NSTimer),但我希望有更好的方法。
答案 0 :(得分:0)
您尝试将UIViewPropertyAnimator子类化,然后覆盖fractionComplete属性吗?
class MyPropertyAnimator : UIViewPropertyAnimator {
override var fractionComplete: CGFloat {
didSet {
print("didSetFraction")
}
}
}