[TOC]

UIViewPropertyAnimator

iOS 10新增动画类 UIViewPropertyAnimator。这是一个能够改善动画处理方式的新类,为动画逻辑添加了一个更为精细的控制手段。

关键のAPI

@available(iOS 10.0, *)

open class UIViewPropertyAnimator : NSObject, UIViewImplicitlyAnimating, NSCopying {

///几种直接创建动画的方法:
    //1.系统提供的曲线
    public convenience init(duration: TimeInterval, curve: UIViewAnimationCurve, animations: (() -> Swift.Void)? = nil)
    //2.两点控制的贝塞尔曲线
    public convenience init(duration: TimeInterval, controlPoint1 point1: CGPoint, controlPoint2 point2: CGPoint, animations: (() -> Swift.Void)? = nil)
    //3.自定义曲线
    public init(duration: TimeInterval, timingParameters parameters: UITimingCurveProvider)

      //自定义曲线包含了普通路径,三维路径和弹性系数
      public protocol UITimingCurveProvider : NSCoding, NSCopying {
        @available(iOS 10.0, *)
        public var timingCurveType: UITimingCurveType { get }

        @available(iOS 10.0, *)
        public var cubicTimingParameters: UICubicTimingParameters? { get }

        @available(iOS 10.0, *)
        public var springTimingParameters: UISpringTimingParameters? { get }
      }


    //4.弹跳系数
    public convenience init(duration: TimeInterval, dampingRatio ratio: CGFloat, animations: (() -> Swift.Void)? = nil)

    //5.类方法
    open class func runningPropertyAnimator(withDuration duration: TimeInterval, delay: TimeInterval, options: UIViewAnimationOptions = [], animations: @escaping () -> Swift.Void, completion: ((UIViewAnimatingPosition) -> Swift.Void)? = nil) -> Self


//遵守UIViewAnimating协议
public protocol UIViewAnimating : NSObjectProtocol {
    //开始动画
    public func startAnimation()
    //延迟开始
    public func startAnimation(afterDelay delay: TimeInterval)
    //暂停
    public func pauseAnimation()
    //停止
    public func stopAnimation(_ withoutFinishing: Bool)

    //动画状态
    public var state: UIViewAnimatingState { get }

    //fractionComplete values are typically between 0 and 1. 
    public var fractionComplete: CGFloat { get set }

    //动画结束或停止时自动调用
    // This method may only be called if the animator is in the stopped state.
    // The finalPosition argument should indicate the final values of the animated properties.
    @available(iOS 10.0, *)
    public func finishAnimation(at finalPosition: UIViewAnimatingPosition)

@end


    /// Animatable view properties that are set by the animation block will be
    /// animated to their new values.
    open func addAnimations(_ animation: @escaping () -> Swift.Void)
    open func addAnimations(_ animation: @escaping () -> Swift.Void, delayFactor: CGFloat)

    //动画完成式
    //position 参数是 UIViewAnimatingPosition 类型,它用于表明动画结束的位置,这个值本身是一个枚举,包含了 starting、end 和 current。通常得到的值是 end。
    open func addCompletion(_ completion: @escaping (UIViewAnimatingPosition) -> Swift.Void)

实例讲解

简单动画创建

//系统提供的曲线:UIViewAnimationCurve
//创建一个改变视图中心的动画。
let animator = UIViewPropertyAnimator(duration: 1.0, curve: .easeOut){
    animView.center = finalPoint
}
animator.startAnimation() //通过 startAnimation() 方法来触发执行

//两点控制的贝塞尔曲线
let animator = UIViewPropertyAnimator(duration: 1.0, 
                                        point1: CGPoint(0.1,0.5), 
                                        point2: CGPoint(0.5, 0.2){
        animView.alpha = 0.0
}

img

//弹性系数参数
let animator = UIViewPropertyAnimator(
               duration: 1.0,
               dampingRatio:0.4){
        animView.center = CGPoint(x:0, y:0)
}
animator.startAnimation(afterDelay:2.5) //延迟启动

img

添加动画Block

UIViewPropertyAnimator 遵守了 UIViewImplicitlyAnimating 协议,这个协议赋予 UIViewPropertyAnimator 许多有趣的特性。比如,除了在初始化期间指定的第一个动画 block 外,还可以添加多个动画 block。

let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
    AView.alpha = 0.0  //第一个动画 block 
}

//添加多个动画 block
animator.addAnimation{ 
    Aview.center = aNewPosition
}
animator.startAnimation()

img

动画状态:state

遵守UIViewAnimating协议有一个状态属性state: UIViewAnimatingState;动画有三种state:activeinactivestopped

  1. 当动画开始或者暂停的时候,动画状态为 active
  2. 当控件被创建出来且没有开始执行动画或者已经执行完动画的时候,它的状态是 inactive
  3. inactivestopped 之间的一点区别:当动画执行完毕或者使用 stop 命令暂停动画后,控件的状态变为 stopped,然后 animator 内部会调用 finishAnimation(at:) 来表明当前动画完毕, 这时状态为 inactive,最后会调用 completion block。

动画交互

动画循环可以通过fractionComplete 属性进行修改。这个值表明了动画的完成百分比,它的取值范围在 0.0 到 1.0 之间。

animator.fractionComplete = slider.value

addCompletion 允许你添加一个在动画执行完毕后才会被触发的 block:

animator.addCompletion { (position) in
    print("Animation completed")
}

//position 参数是 UIViewAnimatingPosition 类型,它用于表明动画结束的位置,这个值本身是一个枚举,包含了 starting、end 和 current。通常得到的值是 end。

results matching ""

    No results matching ""