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

时间:2016-12-09 03:03:11

标签: ios swift animation uiview uiviewpropertyanimator

我一直在关注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),但我希望有更好的方法。

1 个答案:

答案 0 :(得分:0)

您尝试将UIViewPropertyAnimator子类化,然后覆盖fractionComplete属性吗?

class MyPropertyAnimator : UIViewPropertyAnimator {
    override var fractionComplete: CGFloat {
        didSet {
            print("didSetFraction")
        }
    }
}