UIViewPropertyAnimator简介– Hairui lin –中

UIViewPropertyAnimator简介

设定

我们首先创建一个蓝色垂直于中心并水平指向主视图的视图。

向后拖动框

现在,如果动画停止播放后,我们希望将蓝色框拖回其原始位置,然后执行反向动画,该怎么办?

这是pauseOnCompletion派上用场的地方。 通常,当动画到达其.end位置时,将执行完成块,动画师将移回。 处于非活动状态,然后将动画块从系统堆栈中删除。

您可以查看有关UIViewPropertyAnimator可能状态的苹果文档:https://developer.apple.com/documentation/uikit/uiviewanimating

但是,因为我们将pauseOnCompletion设置为true,所以动画师不会移动到。 处于非活动状态,动画不会从系统堆栈中删除。 相反,动画师停留在。 处于活动状态并保留动画块(这意味着我们可以继续使用之前在setupAnimation()函数中添加到动画器的动画块)。

注意:动画制作者执行动画时,位于中。 活动状态,其isRunning属性为true 。 如果动画制作者的动画已暂停,则它仍在中。 活动状态,但其isRunning属性为false

因此,如果要在将pauseOnCompletion设置为true时观察动画是否已“完成”,则需要观察动画师的isRunning属性,该属性需要KVO机制。 在setupAnimation()中添加以下行,以观察动画制作者的isRunning属性。

  //添加观察者以观察动画师是否已暂停 
  animator.addObserver(自己,forKeyPath:#keyPath(UIViewPropertyAnimator.isRunning),选项:[。new],上下文:nil) 

并且,在ViewController中,我们重写了watchValue函数

实现可中断

最终结果将如下所示。 我们希望实现动画的可中断功能,以便可以在动画过程中将其停止并从原处重新开始。

添加点击手势

我们向蓝框添加了轻击手势,因此,每当您点击蓝框时,动画都将暂停。

我们还需要在ViewController中修改observeValue函数,因为现在如果动画已暂停,则它可以指示动画已结束或已被中断。 仅当且仅当动画已达到其结束时,我们才希望反转动画。

修改平移手势

当panGesture开始时,我们要确保动画是否正在运行,是否已暂停。 在某些情况下,如果用户通过平移动画蓝框而不是点击动画蓝框开始,则不会触发点击手势识别器。

这就对了! 希望本文可以帮助您更清楚地了解UIViewPropertyAnimator的基础。

您可以从https://github.com/hairui19/UIViewPropertyAnimatorExample从github下载代码