iOS 多主題切換-Swift 實(shí)現(xiàn)

項(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,246評(píng)論 4 61
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,967評(píng)論 19 139
  • 今天心情喜憂參半。 晚上從媽媽家回來(lái),心情沉重,老媽狀態(tài)不好,面色蒼白,精神萎靡,一直迷迷糊糊的睡著,扎針也沒(méi)有什...
    素顏hb閱讀 296評(píng)論 1 0
  • 如何從犯罪構(gòu)成要件的角度尋找辯點(diǎn) 【原創(chuàng)分享】律師找辯點(diǎn)之絕招(公訴人也適用)
    ssmilerain閱讀 243評(píng)論 0 0
  • 來(lái)美國(guó)兩個(gè)月了,也沒(méi)對(duì)自己的生活有個(gè)記錄,現(xiàn)在回想起來(lái)感覺(jué)自己這兩個(gè)月好虛度哦。那么以后就要堅(jiān)持用這個(gè),總結(jié)學(xué)習(xí)的...
    CC愛(ài)MM閱讀 371評(píng)論 1 1