小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何使用iOS 10的UIViewPropertyAnimator做動畫

 xiaotianyueye 2016-12-07



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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多