UIViewPropertyAnimator 是iOS10中新增的一個執(zhí)行View動畫的類,它主要具有一下的特點:
- 可中斷性
- 可擦除
- 可反轉(zhuǎn)性
- 豐富的動畫時間控制功能
使用 UIViewPropertyAnimator 我們能夠在動畫結(jié)束前動態(tài)的修改一個動畫。這個Animator可以操作View的可動畫屬性,例如 frame、centre、alpha、 transform
初始化方法
UIViewPropertyAnimator 一共提供了5個初始化方法其中一個為類方法:
init(duration: TimeInterval, curve: UIViewAnimationCurve, animations: (() -> Void)? = nil)
這個方法需要我們傳入一個系統(tǒng)的時間函數(shù)UIViewAnimationCurve .easeIn/.easeOut...
init(duration: TimeInterval, controlPoint1: CGPoint, controlPoint2: CGPoint, animations: (() -> Void)? = nil)

init(duration: TimeInterval, dampingRatio: CGFloat, animations: (() -> Void)? = nil)
該方法初始化了一個具有彈性動畫效果的Animator, dampingRatio的取值為0...1
init(duration: TimeInterval, timingParameters: UITimingCurveProvider)
該方法需要我們提供一個遵守 UITimingCurveProvider 協(xié)議的自定義的時間函數(shù),如:UICubicTimingParameters,UISpringTimingParameters
以上四個方法生成的Animator對像都處于待激活狀態(tài),如果想要動畫開始需要我們手動調(diào)用 startAnimation() 方法
class func runningPropertyAnimator(withDuration: TimeInterval, delay: TimeInterval, options: UIViewAnimationOptions = [], animations: () -> Void, completion: ((UIViewAnimatingPosition) -> Void)? = nil)
這個類方法生成一個立即執(zhí)行動畫的Animator對象
修改動畫的方法
func addAnimations(() -> Void)
func addAnimations(() -> Void, delayFactor: CGFloat)
通過上面兩個方法添加的動畫,將會和之前的動畫同時執(zhí)行;如果添加動畫是Animator處于激活狀態(tài),那么添加的動畫執(zhí)行時間將是該動畫的剩余時間。 delayFactor參數(shù)是一個0...1的浮點值,延遲時間是總動畫時長與該參數(shù)的乘積,如duration為2s,delayFaction為0.5,當(dāng)前完成度fractionComplete為0.1,那么當(dāng)前加入的動畫的執(zhí)行時間為0.8s。
如果不同的Animator同時修改一個property,那么動畫效果將會以合適的形式結(jié)合起來,對于大多數(shù)屬性這樣的結(jié)合都會生成一個新的中間值;
不能再Animator狀態(tài)為stop時調(diào)用以上兩個方法;
func addCompletion(_ completion: (UIViewAnimatingPosition) -> Void)
該方法為動畫結(jié)束時添加一個需要執(zhí)行的 block,但當(dāng)調(diào)用stopAnimation(_:) 方法傳入?yún)?shù)為 true 時,這個block將不會執(zhí)行;如果傳入的參數(shù)為false,那么這個 block 將在我們調(diào)用 finishAnimation(at:) 方法之后正常執(zhí)行
func continueAnimation(withTimingParameters parameters: UITimingCurveProvider?, durationFactor: CGFloat)
該方法會提供一個新的時間函數(shù)給當(dāng)前的屬性動畫,durationFactor同樣是各一個0...1的值,只有當(dāng)前的 Animator 狀態(tài)為 active 并且當(dāng)前動畫被暫停(也就是需要調(diào)用 pauseAnimation() 方法)是才能調(diào)用該方法,否則會產(chǎn)生系統(tǒng)錯誤;
其他方法或?qū)傩?/h4>
public var fractionComplete: CGFloat { get set }
public var fractionComplete: CGFloat { get set }
該屬性來著 UIViewAnimating 協(xié)議,表示當(dāng)前動畫已經(jīng)執(zhí)行完成的百分之比,取值范圍為0...1
public func startAnimation()
public func pauseAnimation()
public func stopAnimation(_ withoutFinishing: Bool)
public func finishAnimation(at finalPosition: UIViewAnimatingPosition)
以上4個方法理解比較簡單,其中最后一個方法只能在Animator的狀態(tài)已經(jīng)為stop時調(diào)用;
今天先完成這個類的簡單介紹,更多的運用在只有再來更新和添加。