一個轉(zhuǎn)盤動畫效果+swift組合的模式

轉(zhuǎn)盤動畫.gif

兩個動畫都是相同的原理,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)動畫效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,619評論 1 32
  • 沈華立 公司:慈溪市創(chuàng)鑫車輛零部件有限公司 六項精進224期利他二組學(xué)員 【日精進打卡381】 【知~學(xué)習(xí)】 《六...
    沈華立閱讀 154評論 0 0
  • 高樓那么多燈熾,有哪盞為你點亮, 世界那么多陸地,有哪塊為你停靠, 夜幕那么多星辰,有哪顆為你祈禱?
    葉不挽閱讀 204評論 0 0
  • 地點:本縣中橋夏河某段 交通工具:電瓶車 人物:我一人獨行 天氣:晴、26至32度左 釣時:清晨4點半出發(fā)、上午9...
    luke2102閱讀 237評論 0 0

友情鏈接更多精彩內(nèi)容