項(xiàng)目來(lái)由
工作項(xiàng)目中,產(chǎn)品需要給 APP 加上主題切換,也就是通常黑夜白天切換功能。本著不重復(fù)制造輪子的想法,第一件事就是 google 看有沒(méi)有開(kāi)源的實(shí)現(xiàn),結(jié)果查看一圈悲哀的發(fā)現(xiàn),確實(shí)有這樣的項(xiàng)目,只是擴(kuò)展性,易用性都顯得比較單薄,無(wú)法滿足項(xiàng)目的需求,好不尷尬。于是準(zhǔn)備自己造輪子,經(jīng)過(guò)不斷的修改和完善,把該功能單獨(dú)的提起出來(lái),使得更為通用。最終 **ChameleonSwift **誕生了。歡迎使用,指正,提出您意見(jiàn)。
大概過(guò)了下需求,主題切換涉及各種顏色,文字大小,圖片等等,總得來(lái)說(shuō)主題的切換的核心都是圍繞著 view 來(lái)完成的,具體的也就是 UIView,UIViewController 來(lái)完成的。只是給 UIView 或者其子類添加幾個(gè)屬性顯然是無(wú)法滿足需求的,考慮到情況的復(fù)雜性和擴(kuò)展性,顯然使用方法是一個(gè)更好的方法。繼承一個(gè)通用的 class 是一個(gè)不錯(cuò)的方法。不過(guò)Swift 的 extension(oc 的 category) 給了我們一個(gè)更好的選擇。
優(yōu)點(diǎn):
- 簡(jiǎn)單。其他庫(kù)在使用的時(shí)候,不同的View添加不同的屬性,類型太多使用起來(lái)不容易
- 易于擴(kuò)展。本庫(kù)并沒(méi)有單獨(dú)的屬性用于處理不同主題/皮膚下的表現(xiàn),而是采用閉包的方式來(lái)實(shí)現(xiàn),具有更大的靈活行和自主性
- 高度解耦:本擴(kuò)展一個(gè)簡(jiǎn)單的配置,你可以專注與業(yè)務(wù)邏輯,而不需要考慮皮膚/主題支持使得你的代碼變得丑陋不堪
balabala,這些都是我自賣自夸哈~
原理:
就如前面提到的主題切換的核心在于視覺(jué),具體而言也就是 UIView。所以本文的出發(fā)點(diǎn)就是擴(kuò)展 UIView 來(lái)實(shí)現(xiàn)。 app 控制顯示的主要是 UIView 和 UIViewController,通過(guò)遍歷的調(diào)用 app 的 UIView, UIViewController 就可以實(shí)現(xiàn)相關(guān)功能
使用:
假設(shè)
假設(shè)你使用默認(rèn)的 ThemeStyle(枚舉類型,由Day, Night), 下面代碼中使用 ThemeStyle 作為你使用的主題類型; 當(dāng)然在實(shí)際使用中, 可以完成你自己定義的主題類型,可以是枚舉,數(shù)字,類,可以是任意類型
1,只需要實(shí)現(xiàn)給你想切換主題的 UIView/UIViewController 實(shí)現(xiàn) ch_switchTheme(_:pre:)方法或者設(shè)置回調(diào)ch_switchThemeBlock ,在回調(diào)中想做你做的事情,修改文字顏色,背景圖片,字體等等。這樣你的 app 已經(jīng)支持 主題切換功能
let label = UILabel()
label.ch_switchThemeBlock = { (now:Any, pre:Any?) -> Void in
// 你修改主題的代碼
if let now = ThemeSwitchHelper<你定義的主題類型>.parseTheme(now) { // 獲取 真正的主題
label.text = "\(now)"
...
}
}
或者
override func ch_switchTheme(now: Any, pre: Any?) {
// 你修改主題的代碼
if let now = ThemeSwitchHelper<你定義的主題類型>.parseTheme(now) { // 獲取 真正的主題
label.text = "\(now)"
...
}
}
2,配置你的初始數(shù)據(jù): 在程序啟動(dòng)的時(shí)候配置(默認(rèn)是nil)
ThemeServiceConfig.instance.initThemeData(data: ThemeStyle.Day)
3,最后,你只需要調(diào)用
UIApplication.ch_switchTheme(ThemeStyle.Night)
就可以完成了
有用的幫助函數(shù)
ThemeSwitchHelper定義了一些有用的函數(shù)
- 獲取當(dāng)前的主題: ThemeSwitchHelper<你定義的主題類型>.current
- 解析參數(shù)獲取當(dāng)前主題: ThemeSwitchHelper<你定義的主題類型>.parseTheme()
- 當(dāng)前主題的圖片: ThemeSwitchHelper<你定義的主題類型>.image()
- 當(dāng)前主題的顏色: ThemeSwitchHelper<你定義的主題類型>.color()
- 當(dāng)前主題的配置(如果圖片,顏色不滿足你的需求,你可以使用這個(gè)): ThemeSwitchHelper<你定義的主題類型>.currentData()
關(guān)于如何使用更多更詳細(xì)的說(shuō)明,請(qǐng)參見(jiàn) ChameleonSwift