LVThemeKit
需求
App 裡可以皮膚化的 UI 區域分為 3 塊(App 皮膚/閱讀器主題/其他),這 3 塊又和黑夜模式有重疊。
- App 皮膚區域有首頁 4 個 tab bar 頁面(還沒有實現主題化,在規劃中)
- 閱讀器主題區域主要是閱讀器相關的設定和選單頁面
- 其他指不需要主題化的區域

第一種方案
主要思路就是給 UIKit 的 Category 增加一些屬性,配置每一類主題的 key,在第一次賦值或者收到主題改變的通知時進行 apply。


qd 是黑夜模式字首,readerTheme 是閱讀器主題字首
這種方案的問題是
- 如果要增加一類主題(比如 App 皮膚類),需要把所有之前增加的屬性都 copy 一下(包括 apply 部分的程式碼),工作量很大。
- 如果要增加一個新的屬性,需要新增多遍(字首分別是qd/readerTheme/app)。
重構之後的方案
藉助 OC 的泛型和 KVC 的一次重構


重構前後對比

程式碼實現樣例:LVThemeKit