有没有办法观察UIViewPropertyAnimator中fractionComplete的变化

Dun*_*n C 17 animation uiview ios swift uiviewpropertyanimator

我一直在关注UIViewPropertyAnimatoriOS 10中非常酷的新课程.它可以让您轻松地执行暂停,恢复和反向飞行UIView动画等操作.过去,您必须操纵系统创建的基础CAAnimations才能使用UIView动画执行此操作.

UIViewPropertyAnimator班级有一个属性fractionComplete.它从0.0(动画开始)到1.0(动画结束)不等.如果更改了值,则可以从头到尾"擦除"动画.

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

我决定使用创建一个等效的项目UIViewPropertyAnimator.有一些怪癖,但它相当简单.我无法弄清楚如何干净利落的一件事是观察动画fractionComplete属性的进度,以便我可以随着动画的进展更新滑块.我尝试在fractionComplete属性上设置KVO(键值观察),但在动画完成之前它不会触发KVO通知.

我落得这样做是建立上一个很小的间隔运行,并查询定时器UIViewPropertyAnimatorfractionComplete反复性和更新滑块,因为它的进展.它有效,但它不是一种非常干净的做事方式.如果有办法获得有关动画进度的通知会好得多.

我希望有一些我想念的东西.

您可以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()
  }
}
Run Code Online (Sandbox Code Playgroud)

我应该将上面的代码转换为使用CADisplayLink计时器而不是vanilla Timer(NSTimer),但我希望有更好的方法.

Dun*_*n C 4

仅供参考,经过研究后,答案似乎是不,随着动画的进展,没有办法获取更新。您必须设置一个计时器(aTimer或 a)CADisplayLink,并在每次触发时更新您的进度值。