快速入門指南:使用 UIViewPropertyAnimator 做動畫

whl_open 7年前發布 | 10K 次閱讀 貝塞爾曲線 iOS開發 移動開發

iOS 10 帶來了一堆非常有意思的新特性,例如 UIViewPropertyAnimator 。這是一個能夠改善動畫處理方式的新類。

它徹底改變了我們所習慣的工作流,為動畫邏輯添加了一個更為精細的控制手段。

一個簡單例子

讓我們看看如何創建一個改變視圖中心的動畫。

let animator = UIViewPropertyAnimator(duration: 1.0, curve: .easeOut){
    AView.center = finalPoint
}
animator.startAnimation()

這里至少有 3 點值得去關注:

  1. 動畫是通過一個閉包來定義的,這與 UIView 的動畫方法 “UIView.animation(duration:…)” 十分相似。
  2. 方法返回了一個對象——animator。
  3. 動畫并不是立即執行,而是通過 startAnimation() 方法來觸發執行。

動畫狀態

使用這種新方式來處理動畫的不同之處就是 animator 有完整的狀態機邏輯。通過 UIViewAnimation 協議,控件可以用一種簡單明了的方式實現動畫 狀態 的管理,例如調用 startAnimation 、 pauseAnimation 和 stopAnimation 函數。通過調用這些函數,我們可以更新控件的狀態,使得控件在 active 、 inactive 和 stopped 狀態之間轉換。

當動畫開始或者暫停的時候,動畫狀態為 active , 當控件被創建出來且沒有開始執行動畫或者已經執行完動畫的時候,它的狀態是 inactive 。這里還是要聲明下 inactive 和 stopped 之間還是有一點區別的。當動畫執行完畢或者使用 stop 命令暫停動畫后,控件的狀態變為 stopped ,而在 animator 內部會調用 finishAnimation(at:) 來表明當前動畫完畢, 然后會設置當前狀態為 inactive ,最后會調用 completion block (稍后會詳細說明)

動畫選項

在之前的例子中應該注意到了,在動畫的 block 中,我們定義了兩個參數:動畫的 duration 和動畫的 curve , 一個 UIViewAnimationCurve 能夠表示大部分的常見動畫曲線類型( easeIn, easeOut, liner 或者 easeInOut )。

當你需要對動畫曲線做更多的設置時,你可以通過兩個控制點來定義一個貝塞爾曲線

let animator = UIViewPropertyAnimator(
               duration: 1.0, 
               point1: CGPoint(0.1,0.5), 
               point2: CGPoint(0.5, 0.2){

        AView.alpha = 0.0
}

(如果貝塞爾曲線也不能滿足需求的話,可以使用 UITimingCurveProvider 創建一個完全自定義的曲線)

另外一個有趣的動畫選項是你可以向函數傳遞 dampingRatio 參數。這與 UIView 的動畫方法相似,可以通過使用一個 0 到 1 的 damping 值來實現彈跳效果。

let animator = UIViewPropertyAnimator(
               duration: 1.0,
               dampingRatio:0.4){

        AView.center = CGPoint(x:0, y:0)
}

讓動畫延后執行的操作也非常簡單,只需要在 startAnimation 函數中傳入 afterDelay 參數。

animator.startAnimation(afterDelay:2.5)

動畫 Block

UIViewPropertyAnimator 遵守了 UIViewImplicitlyAnimating 協議,這個協議賦予 UIViewPropertyAnimator 許多有趣的特性。舉個例子,除了在初始化期間指定的第一個動畫 block 外,還可以指定多個動畫 block。

// Initialization
let animator = UIViewPropertyAnimator(duration: 2.0, curve: .easeOut){
    AView.alpha = 0.0
}
// Another animation block
animator.addAnimation{ 
    Aview.center = aNewPosition
}
animator.startAnimation()

你也可以在已經執行動畫的代碼里添加動畫 block, 這個 block 會立即執行并使用剩下的時間作為其動畫時長。

與動畫的交互

在前面的內容里已經說明了我們可以通過調用 startAnimation、stopAnimation 和 pauseAnimation 等方法實現動畫的循環。默認的動畫循環可以通過 fractionComplete 屬性進行修改。這個值表明了動畫的完成百分比,它的取值范圍在 0.0 到 1.0 之間。這樣就可以通過修改 fractionComplete 來讓循環達到預期效果(例如:用戶可能會通過 slider 或者 pan 手勢來實時改變參數值)

animator.fractionComplete = slider.value

在一些場景下,你可能想在動畫執行完畢后做一些操作, addCompletion 允許你添加一個在動畫執行完畢后才會被觸發的 block。

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

position 參數是 UIViewAnimatingPosition 類型,它用于表明動畫結束的位置,這個值本身是一個枚舉,包含了 starting、end 和 current。通常得到的值是 end。

這就是快速入門指南的全部內容了。

我已經迫不及待地想使用這個新的動畫系統來實現一些酷炫的 UI 效果了!我會在 推ter 上分享作品 :wink: Ciao!

本文由 SwiftGG 翻譯組翻譯,已經獲得作者翻譯授權,最新文章請訪問http://swift.gg。

 

來自:http://swift.gg/2017/04/20/quick-guide-animations-with-uiviewpropertyanimator/

 

 本文由用戶 whl_open 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!