iOS 10 帶來了一大票有意思的很特性,像 UIViewPropertyAnimator,它是一個改善動畫處理的全新的類。這個視圖屬性動畫完全顛覆了我們已經(jīng)習慣的流程,能夠為動畫邏輯添加更精細的控制。
一個簡單的動畫 讓我們來看看如何通過一個簡單的動畫改變視圖的中心點屬性。
let animator = UIViewPropertyAnimator(duration: 1.0, curve: .easeOut){ AView.center = finalPoint } animator.startAnimation()
至少有3點需要注意: 1) 這個動畫是通過閉包來定義的,與UIView 動畫類的“UIView.animation(duration:…)”很相似。 2) 返回一個對象,即動畫創(chuàng)建者。
3)這個動畫不是立刻開始的,而是通過 `startAnimation()`方法觸發(fā)的。
動畫狀態(tài) 我們對一個元素執(zhí)行動畫操作方式的主要變化與以下事實有關(guān):一個屬性動畫器包含一整套狀態(tài)機邏輯。通過`UIViewAnimating`協(xié)議實現(xiàn)的功能以一種簡單明了的方式管理動畫的狀態(tài),而這些狀態(tài)又是通過`startAnimation`, `pauseAnimation` 和 `stopAnimation`函數(shù)來實現(xiàn)的。調(diào)用這些方法我們可以更新狀態(tài)的值,使之能在`active`,`inactive`和`stopped`之間轉(zhuǎn)換。
當動畫開始或者暫停時,動畫的狀態(tài)就是`活躍狀態(tài)`;當動畫已被初始化但是還未開始或者動畫已完成,它就是`非活躍狀態(tài)`。需要注意的是 在`非活躍狀態(tài)`和`停止態(tài)`之間有一點點不同。當動畫因停止命令而完成或者它真的已經(jīng)完成后,狀態(tài)會變成`停止態(tài)`,動畫器內(nèi)部會調(diào)用方法`finishAnimation(at:)` 來標記動畫 已完成,將狀態(tài)設(shè)置為`非活躍狀態(tài)`,并最終調(diào)用完成的代碼塊。
動畫的可選項 可能你已經(jīng)在前面的例子里注意到,和動畫的 block一起,我們定義了兩個參數(shù):動畫時長和動畫曲線,一個UIViewAnimationCurve實例,代表著最常見的曲線(easeIn,easeOut,linear或easeInOut)。 如果想獲得對動畫曲線的更多控制,你可以使用由兩個控制點定義的貝塞爾曲線。
let animator = UIViewPropertyAnimator( duration: 1.0, point1: CGPoint(0.1,0.5), point2: CGPoint(0.5, 0.2){ AView.alpha = 0.0 }
(如果一條貝塞爾曲線依然不夠,你甚至可以使用[UITimigCurveProvider]來指定一條完全自定義的曲線) 另一個可以傳給構(gòu)造器的有意思的參數(shù)是 阻尼系數(shù)值。用法與UIView 的動畫方法類似,你可以定義出彈簧效果,阻尼系數(shù)的取值范圍是0到1.
let animator = UIViewPropertyAnimator( duration: 1.0, dampingRatio:0.4){ AView.center = CGPoint(x:0, y:0) }
延遲動畫的執(zhí)行也非常簡單,只需要調(diào)用帶有`afterDelay`參數(shù)的`startAnimation`方法即可。
animator.startAnimation(afterDelay:2.5)
動畫的block `UIViewPropertyAnimator` 采用的是能夠為動畫器提供很多有趣能力的`UIViewImplicitlyAnimating`協(xié)議。例如,除了在初始化時候指定的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()
你還可以向運行中的動畫添加動畫塊,該動畫塊將立即使用剩余時間作為新動畫的持續(xù)時間來執(zhí)行。
與動畫流交互 正如我們已提過的那樣,我們可以通過調(diào)用`startAnimation`, `pauseAnimation` 和 `stopAnimation`輕松地與動畫流交互。動畫的默認流(從起始點到結(jié)束點),可以通過`fractionComplete`屬性更改。這個值表示動畫完成的百分比,取值范圍是0 到 1。你能夠修改這個值來像你期望的那樣驅(qū)動流(例如:用戶可能會用滑塊或滑動手勢實時地修改`fraction`)。
animator.fractionComplete = slider.value
某些情形下,你可能希望在動畫運行完畢時執(zhí)行一些操作。 `addCompletion` 方法能讓你添加一個(當動畫完成時會被觸發(fā)的)代碼塊。
animator.addCompletion { (position) in print('Animation completed') }
`position`參數(shù)是一個 `UIViewAnimatingPosition`類型的值,它有三個枚舉值,分別代表動畫是在開始停止,結(jié)束后停止,還是當前位置停止。 通常你都會收到結(jié)束的枚舉值。 (譯者注:`UIViewAnimatingPosition`的三個枚舉值分別是`end`,`start`,`current`) 這就是這份快速指南的全部內(nèi)容啦。
我已經(jīng)迫不及待地想要用這個新的動畫系統(tǒng)來實現(xiàn)一些很酷的UI 效果了。我會在我的Twitter上分享我的經(jīng)驗!
微信號:CocoaChinabbs
|