iOS如何優(yōu)雅地實(shí)現(xiàn)序列動(dòng)畫詳解
前言
我們的在做動(dòng)效中經(jīng)常會(huì)有這樣的需求,A動(dòng)畫執(zhí)行完,執(zhí)行B動(dòng)畫,B動(dòng)畫執(zhí)行完執(zhí)行C動(dòng)畫這樣的序列,比如如下效果:

iOS 10之前,我們可能這樣實(shí)現(xiàn)這個(gè)動(dòng)畫序列,實(shí)際上可能你現(xiàn)在的代碼就是這樣寫的:

UIView.animate()提供了一個(gè)完成block回調(diào),我們可以用它來觸發(fā)下一個(gè)動(dòng)畫。這樣做,我們可以實(shí)現(xiàn)這個(gè)動(dòng)畫。正如你可以看到的,這坨代碼的主要缺點(diǎn)是丑陋,幾乎沒有可讀性。
UIViewPropertyAnimator
iOS10引入了UIViewPropertyAnimator ,基于篇幅原因,這里不對(duì)其做詳細(xì)介紹,如果需要讀者請(qǐng)自行補(bǔ)腦。我關(guān)心的是如何提高這類多層嵌套代碼的可讀性,通過UIViewPropertyAnimator,前面的代碼片斷將成為:

通過上面的方式我們可以將動(dòng)畫定義分離開來,這樣不僅有更好的可讀性,還可以解耦。這樣已經(jīng)比開始的代碼漂亮多了,但是我們還可以寫的更好...
Reactive animation chaining
我是一個(gè)rx的重度用戶,我首先想到的是:是否有辦法讓UIViewPropertyAnimation與RxSwift兼容?
大概思路是觀察一個(gè)動(dòng)畫的狀態(tài),然后觸發(fā)下一個(gè),接下來我們通過擴(kuò)展UIViewPropertyAnimation來實(shí)現(xiàn) 擴(kuò)展會(huì)有封裝UIViewPropertyAnimator的“startAnimation”和“addCompletion”機(jī)制。它將返回的可觀察的狀態(tài)。但是為了簡單起見,我們假定一個(gè)動(dòng)畫只能“complete”,沒有“stream”管理(如onNext、onSubscribed onDisposed等等)。
Talk is cheap,Show me the code

上面動(dòng)畫擴(kuò)展返回一個(gè) Completable狀態(tài) ,訂閱時(shí),將開始動(dòng)畫和添加完成回調(diào),發(fā)送一個(gè)“.completed”事件。目的很簡單:當(dāng)完成動(dòng)畫,開始執(zhí)行下一個(gè)開始動(dòng)畫,代碼如下。

按理說寫到這里應(yīng)該結(jié)束了,但是可能有讀者說,我們并沒有引入RX,沒錯(cuò)你的代碼很優(yōu)雅,然而對(duì)我們來說成本有點(diǎn)高,那么就繼續(xù)講講其他的方案,總有一款適合你。
自定義操作符
我們都知道Swift有很cool的特性:自定義操作符,我們總希望把代碼些簡單,讓別的同事看自己的代碼時(shí)一目了然,都不需注釋就懂什么意思,比如:
animation1 ~> animation2 ~> animation3 ~> animation4
很簡單,自定義~>操作符如下:

接下來使用這個(gè)操作符實(shí)現(xiàn)動(dòng)畫

好了,自此關(guān)于如何避免寫出丑陋的嵌套動(dòng)畫代碼寫完了,enjoy
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- iOS實(shí)現(xiàn)抖音點(diǎn)贊動(dòng)畫效果
- iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫特效
- iOS仿AirPods彈出動(dòng)畫
- iOS自定義轉(zhuǎn)場動(dòng)畫的幾種情況
- iOS自定義UIButton點(diǎn)擊動(dòng)畫特效
- iOS基于CATransition實(shí)現(xiàn)翻頁、旋轉(zhuǎn)等動(dòng)畫效果
- iOS實(shí)現(xiàn)轉(zhuǎn)場動(dòng)畫的3種方法示例
- iOS實(shí)現(xiàn)數(shù)字倍數(shù)動(dòng)畫效果
- iOS仿抖音視頻加載動(dòng)畫效果的實(shí)現(xiàn)方法
- iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法
- 詳解 iOS 系統(tǒng)中的視圖動(dòng)畫
相關(guān)文章
ios開發(fā)中時(shí)間轉(zhuǎn)換的方法集錦
這篇文章主要介紹了ios開發(fā)中時(shí)間轉(zhuǎn)換的方法集錦,需要的朋友可以參考下2015-05-05
iOS實(shí)現(xiàn)app間跳轉(zhuǎn)功能
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)app間跳轉(zhuǎn)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
iOS App中實(shí)現(xiàn)播放音效和音樂功能的簡單示例
這篇文章主要介紹了iOS App中實(shí)現(xiàn)播放音效和音樂功能的簡單示例,示例代碼為傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-03-03
簡介iOS開發(fā)中應(yīng)用SQLite的模糊查詢和常用函數(shù)
這篇文章主要介紹了iOS開發(fā)中應(yīng)用SQLite的模糊查詢和常用函數(shù),SQLite是一個(gè)可作嵌入式的數(shù)據(jù)庫非常適合小型應(yīng)用使用,需要的朋友可以參考下2015-12-12
ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式
這篇文章主要介紹了ios實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,第一種方式使用NSTimer來實(shí)現(xiàn),第二種方式使用GCD來實(shí)現(xiàn)。具體內(nèi)容詳情大家參考下本文2017-01-01

