
兩個動畫都是相同的原理,CAShapeLayer + mask,第二個動畫多了一個指針,設(shè)置好錨點即可。動畫部分很簡單,這不是重點要說的,要說的是如何在代碼層面上設(shè)計好組合動畫。
對于第一個動畫來說,它很簡單就一個動畫效果;對第二個動畫來說,它是轉(zhuǎn)盤動畫 + 指針動畫組合產(chǎn)生的。這是兩個視圖view,分散在兩個不同的文件中。一開始我是用OC寫的,沒考慮第二個的情況下,先把第一個搞定,分為計算部分 + 視圖處理部分。在寫第二個的時候,我發(fā)現(xiàn)對于旋轉(zhuǎn)的計算這部分代碼完全是一樣的,只有視圖處理部分加上了指針的處理。我要想辦法把計算部分抽離出來才合理,這個時候我是用OC寫的,首先想到的就是繼承,顯然。。。非常的不合適,沒有誰應(yīng)該被抽象出來,然后考慮工具類,似乎可行但覺得。。。設(shè)計層面有點過于尷尬,這個工具類其實也并不是工具一說,它只是一個負(fù)責(zé)計算的職責(zé)模塊;那么最后的選擇,肯定是組合了,如何組合呢?我就需要一個類,單獨處理計算部分,然后有一個代理事件,計算完成讓服從代理的類去處理視圖部分。這個負(fù)責(zé)計算部分的類的實例作為動畫視圖的一個屬性組合在動畫視圖上,似乎達(dá)到了我們先前的一個需求。在OC中這或許是比較不錯的方法,但是仔細(xì)思考下,這個負(fù)責(zé)計算的類其實問題也不?。?/p>
1.雖然OC中萬物皆對象,但單純的計算模塊就分化成一個類會使得類過于龐大;
2.視圖對象中放入計算類對象,使得視圖對象似乎是一個指揮者,而不是一個協(xié)同者;
你會發(fā)現(xiàn),這個類的問題其實是OC中組合模式牽強實現(xiàn)的問題,但我們似乎沒有太好的方法去改變OC中組合的現(xiàn)狀。
莫慌,swift助你一臂之力。
swift中的協(xié)議使得組合模式能良好地發(fā)揮。
對應(yīng)上面的例子,我們分離出旋轉(zhuǎn)動畫計算部分似乎非常的easy,同時swift中的協(xié)議可以帶入變量,使得我們完全可以脫離了類的概念更好地發(fā)揮。
整個協(xié)議的設(shè)計非常簡單,像下面這樣:
//動畫旋轉(zhuǎn)計算協(xié)議
protocol RotaryAnimationCalculateProtocol where Self : UIView {
//配置
var rotaryVariable : RotaryVariableStruct {get set}
//服從協(xié)議的類需要對視圖操作的方法
func detailView()
}
在extension中,我具體處理了計算上的事務(wù),具體的動畫參數(shù)由RotaryVariableStruct這個結(jié)構(gòu)體配置,這也是swift的一個優(yōu)點,對結(jié)構(gòu)體的友好,使得很多地方不需要model,一切從簡。
這里和OC中不同的地方,應(yīng)該就是對組合方式的實現(xiàn)上,OC中靠類來組合,swift中協(xié)議就可以搞定,OC中需要靠別的類的引入來調(diào)用對應(yīng)的能力,給人一種很強的指揮者的感覺;而swift中的協(xié)議更像是一個個插件,服從協(xié)議即獲得對應(yīng)的插件能力,是一種完全組合化協(xié)同的思想。
無論是從形式還是思想上,swift對組合化的實現(xiàn)都比OC略勝一籌。
整理了一下放到git上:旋轉(zhuǎn)動畫效果