參考連接:css
WWDC 2019-Implementing Dark Mode on iOS前端
Reource-Adopting iOS Dark Modeios
狀態UITraitCollection
改變從屏幕到 view 的傳遞過程,目前支持手動觸發和自動觸發。若是設置了 view 的 dynamic color 和 dynamic image, 則 view 的 color 和 image 都會跟着改變。web
當前情景改變會調用UITraitEnvironment(iOS 8)
協議的方法,對於須要單獨適配的 View,ViewController 須要在此方法進行一些特殊處理,UIView,UIViewController 均遵照該協議app
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
// 對比情景改變
BOOL isChanged = [traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection];
}
複製代碼
View 的 layoutSubView, ViewController 的 viewDidLayoutSubviews 均會觸發 traitCollectionDidChange:
方法ide
Dynamic Colorpost
動態顏色,根據當前情景自動切換顏色,iOS 13 新定義了一批 dynamic color, 大部分以 system 開頭,也有以適用類別開頭的,例如
labelColor,systemGroupedBackgroundColor
,能夠直接用ui
自定義 dynamic colorspa
// iOS 13
UIColor *dynamicColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull traitC) {
if (traitC.userInterfaceStyle == UIUserInterfaceStyleDark) {
return UIColor.redColor;
} else {
return UIColor.greenColor;
}
}];
複製代碼
根據當前情景取出 dynamic color 中的色值----用於根據不一樣情景取色值,設置色值。debug
UIColor *dynamicColor = [UIColor systemBackgroundColor];
UITraitCollection *traitCollection = someView.traitCollection;
UIColor *resolvedColor = [dynamicColor resolvedColorWithTraitCollection:traitCollection];
複製代碼
示例用途:
// 設置 view 的 border 顏色
UILayer *layer = [UILayer new];
UITraitCollection *traitCollection = someView.traitCollection;
// option 1 -- iOS 8
UIColor *resolvedColor = [dynamicColor resolvedColorWithTraitCollection:traitCollection];
layer.borderColor = resolvedColor.CGColor;
// option 2 -- iOS 13
[traitCollection performAsCurrentTraitCollection:^{
layer.borderColor = resolvedColor.CGColor;
}];
// option 3 -- iOS 13
UITraitCollection *savedTraitCollection = [UITraitCollection currentTraitCollection];
[UITraitCollection setCurrentTraitCollection:traitCollection];
layer.borderColor = UIColor.labelColor.CGColor;
[UITraitCollection setCurrentTraitCollection:savedTraitCollection];
複製代碼
Dynamic Image
建立 dynamic image
webContent
前端代碼示例:詳見 WWDC Resource
// 色值
:root {
color-scheme: light dark;
--post-title-color: #333;
--header-bg-color: #593a78;
--header-txt-color: white;
}
@media (prefers-color-scheme: dark) {
:root {
--post-title-color: white;
--header-bg-color: #513d66;
--header-txt-color: #eee;
}
}
h1 {
color: var(--post-title-color);
}
.header {
background-color: var(--header-bg-color);
color: var(--header-txt-color);
}
// 圖片
<img src="mojave-day.jpg">
<picture>
<source srcset="mojave-night.jpg" media="(prefers-color-scheme: dark)">
<img src="mojave-day.jpg">
</picture>
複製代碼
設置啓動參數 Enable debug logging with launch argument
-UITraitCollectionChangeLoggingEnabled YES