iOS如何優(yōu)雅地實現序列動畫詳解
前言
我們的在做動效中經常會有這樣的需求,A動畫執(zhí)行完,執(zhí)行B動畫,B動畫執(zhí)行完執(zhí)行C動畫這樣的序列,比如如下效果:
iOS 10之前,我們可能這樣實現這個動畫序列,實際上可能你現在的代碼就是這樣寫的:
UIView.animate()
提供了一個完成block回調,我們可以用它來觸發(fā)下一個動畫。這樣做,我們可以實現這個動畫。正如你可以看到的,這坨代碼的主要缺點是丑陋,幾乎沒有可讀性。
UIViewPropertyAnimator
iOS10引入了UIViewPropertyAnimator ,基于篇幅原因,這里不對其做詳細介紹,如果需要讀者請自行補腦。我關心的是如何提高這類多層嵌套代碼的可讀性,通過UIViewPropertyAnimator,前面的代碼片斷將成為:
通過上面的方式我們可以將動畫定義分離開來,這樣不僅有更好的可讀性,還可以解耦。這樣已經比開始的代碼漂亮多了,但是我們還可以寫的更好...
Reactive animation chaining
我是一個rx的重度用戶,我首先想到的是:是否有辦法讓UIViewPropertyAnimation與RxSwift兼容?
大概思路是觀察一個動畫的狀態(tài),然后觸發(fā)下一個,接下來我們通過擴展UIViewPropertyAnimation來實現 擴展會有封裝UIViewPropertyAnimator的“startAnimation”和“addCompletion”機制。它將返回的可觀察的狀態(tài)。但是為了簡單起見,我們假定一個動畫只能“complete”,沒有“stream”管理(如onNext、onSubscribed onDisposed等等)。
Talk is cheap,Show me the code
上面動畫擴展返回一個 Completable狀態(tài) ,訂閱時,將開始動畫和添加完成回調,發(fā)送一個“.completed”事件。目的很簡單:當完成動畫,開始執(zhí)行下一個開始動畫,代碼如下。
按理說寫到這里應該結束了,但是可能有讀者說,我們并沒有引入RX,沒錯你的代碼很優(yōu)雅,然而對我們來說成本有點高,那么就繼續(xù)講講其他的方案,總有一款適合你。
自定義操作符
我們都知道Swift有很cool的特性:自定義操作符,我們總希望把代碼些簡單,讓別的同事看自己的代碼時一目了然,都不需注釋就懂什么意思,比如:
animation1 ~> animation2 ~> animation3 ~> animation4
很簡單,自定義~>操作符如下:
接下來使用這個操作符實現動畫
好了,自此關于如何避免寫出丑陋的嵌套動畫代碼寫完了,enjoy
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
iOS中Swift UISearchController仿微信搜索框
這篇文章主要介紹了iOS中Swift UISearchController仿微信搜索框效果,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05iOS開發(fā)--仿新聞首頁效果WMPageController的使用詳解
這篇文章主要介紹了iOS開發(fā)--仿新聞首頁效果WMPageController的使用詳解,詳解的介紹了iOS開發(fā)中第三方庫WMPageController控件的使用方法,有需要的可以了解下。2016-11-11支持Xcode10和適配iPhone XS Max、iPhone XR的方法
這篇文章主要介紹了支持Xcode10和適配iPhone XS Max、iPhone XR的方法,文中通過示例代碼以及圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-10-10實例講解iOS應用開發(fā)中UIPickerView滾動選擇欄的用法
這篇文章主要介紹了iOS應用開發(fā)中UIPickerView滾動選擇欄的用法,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-04-04Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用
這篇文章主要介紹了Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用,重點講解了EGOCache對緩存過期時間的檢測及處理,需要的朋友可以參考下2016-05-05