UIViewPropertyAnimator

UIViewPropertyAnimator

我一直在研究iOS 10中非常酷的新UIViewPropertyAnimator类。它使您可以轻松进行诸如暂停,恢复和反转飞行中的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属性,并在滑块进行时对其进行更新。它可以工作,但这不是一种很干净的处理方式。如果有一种方法可以通知动画进度,那就更好了。

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

您可以通过以下链接在Github上查看基于UIViewPropertyAnimator的项目: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计时器而不是普通计时器(NSTimer),但我希望有更好的方法。

最佳答案

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

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

关于ios - 有没有一种方法可以观察UIViewPropertyAnimator中fractionComplete的变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41052439/

10-09 12:37