前言
暗黑模式(Dark Mode)是iOS13推出的新功能半哟,將傳統(tǒng)的UIColor升級成dynamicColor苗傅。
TABAimated在v2.2.3實現(xiàn)了自動轉(zhuǎn)換暗黑系列骨架屏楞抡。
本文講解在v2.3.0版本的暗黑模式實現(xiàn)漆改。
TABAnimated的骨架層是用CALayer實現(xiàn)的在抛,但是CGColorRef并不能成為動態(tài)顏色,所以本文也將說明TABAnimated是如何實現(xiàn)動態(tài)的CGColorRef谅将。
先睹為快
包括四種動畫在內(nèi),多種應用場景重慢,均以完美適配暗黑模式饥臂。
新增Api
屬性 | 全局類 | 局部類 | 含義 |
---|---|---|---|
darkAnimatedColor | TABAnimated | TABViewAnimated | 暗黑模式骨架屏內(nèi)容顏色 |
darkAnimatedBackgroundColor | TABAnimated | TABViewAnimated | 暗黑模式骨架屏背景顏色 |
開發(fā)者需要做什么?
原則上什么都不需要似踱,但是背景顏色隅熙、內(nèi)容顏色和各自產(chǎn)品有關(guān),所以開放了對應屬性核芽。
通過gif囚戚,你發(fā)現(xiàn)了什么?
如下圖轧简,在已經(jīng)切換暗黑模式后弯淘,進程卡片列表頁面沒有刷新,如果是UIColor系統(tǒng)會自動刷新吉懊,CGColorRef暫時沒有找到辦法處理庐橙。
結(jié)構(gòu)圖
暗黑模式實時性原理
我們知道只有UIView、UIViewController借嗽、UIPresentationController才能監(jiān)聽模式切換事件态鳖。
通過給予控制視圖添加一個透明、size為(.1, .1)的哨兵視圖恶导,監(jiān)聽哨兵視圖的traitCollection的變化浆竭,
再將該消息傳遞給暗黑模式管理者協(xié)議。
哨兵視圖的管理者自然也是暗黑模式管理者惨寿。
暗黑模式管理者協(xié)議
為了進一步與生產(chǎn)層解耦邦泄,引入了TABAnimatedDarkModeManagerInterface
協(xié)議
// 綁定controlView
- (void)setControlView:(UIView *)controlView;
// 添加哨兵視圖
- (void)addDarkModelSentryView;
/// 添加需要實時改變的view
- (void)addNeedChangeView:(UIView *)view;
// 釋放
- (void)destroy;
1. setControlView
生產(chǎn)層在綁定controlView視圖時,同時給予暗黑模式管理者綁定該controlView裂垦。
暗黑模式管理者需要controlView的原因:
獲取controlView的traitCollection顺囊、tabAnimated,以提供給暗黑模式主體
2. addDarkModelSentryView
生產(chǎn)層綁定controlView后蕉拢,給予controlView添加一個哨兵視圖特碳。
該哨兵視圖用于監(jiān)聽traitCollection的變化
3. addNeedChangeView:
controlView視圖的骨架屏主體不一定是其本身,比如UITableView是其上的cell晕换。
該接口會將新生成的view加入到管理列表中
4. destroy
生命周期結(jié)束后午乓,銷毀不需要的對象
如何自定制骨架屏暗黑模式轉(zhuǎn)換?
需要新建類,遵循自TABAnimatedDarkModeInterface
。
/// 暗黑模式轉(zhuǎn)化協(xié)議主體械媒,開發(fā)者可重寫
/// TABAnimatedDarkModeImpl是該協(xié)議默認的實現(xiàn)疑苫,根據(jù)traitCollection、tabAnimated自動轉(zhuǎn)化backgroundLayer吴菠、layers的屬性
/// @param traitCollection 當前的traitCollection
/// @param tabAnimated 目標tabAnimated
/// @param backgroundLayer 目標背景l(fā)ayer
/// @param layers 目標layers
- (void)traitCollectionDidChange:(UITraitCollection *)traitCollection
tabAnimated:(TABViewAnimated *)tabAnimated
backgroundLayer:(TABComponentLayer *)backgroundLayer
layers:(NSArray <TABComponentLayer *> *)layers;
開發(fā)者根據(jù)入?yún)⑺峁┑?code>traitCollection來判斷當前模式笆檀,
根據(jù)tabAnimated
獲取控制視圖的參數(shù)橙依,最后根據(jù)自己的骨架枣接、動畫需求,自行調(diào)整暗黑風格缺谴。
模式禁用
apple本身是支持局部但惶、全局禁用暗黑模式的,骨架屏同樣會跟隨你的禁用而禁用暗黑系骨架屏湿蛔。所以對于骨架屏而言膀曾,除了配置顏色外,你不需要做任何其他多余的事情阳啥。
不能兼容的情況
后臺卡片列表顯示頁面不能實時刷新添谊。
解決方案:骨架層由CALayer換成UIView(這種方案不予采用)