今天的 WWDC 19 上發(fā)布了 iOS 13足绅,我們來看下如何適配 DarkMode摩泪。首先我們來看下效果圖
DarkMode 主要從兩個方面去適配笆焰,顏色和圖片
顏色適配
iOS 13 下 UIColor
增加了一個初始化方法,我們可以用這個初始化方法完成 DarkMode 的適配
@available(iOS 13.0, *)
public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)
這個方法要求傳一個閉包進去见坑,當系統(tǒng)從 LightMode 和 DarkMode 之間切換的時候就會觸發(fā)這個回調嚷掠。
這個閉包返回一個 UITraitCollection
類,我們要用這個類的 userInterfaceStyle
屬性荞驴。
userInterfaceStyle
是一個枚舉叠国,聲明如下
@available(iOS 12.0, *)
public enum UIUserInterfaceStyle : Int {
case unspecified
case light
case dark
}
這個枚舉會告訴我們當前是 LightMode or DarkMode
現(xiàn)在我們創(chuàng)建兩個 UIColor
并賦值給 view.backgroundColor
和 label
,代碼如下
let backgroundColor = UIColor { (traitCollection) -> UIColor in
switch traitCollection.userInterfaceStyle {
case .light:
return UIColor.white
case .dark:
return UIColor.black
default:
fatalError()
}
}
view.backgroundColor = backgroundColor
let labelColor = UIColor { (traitCollection) -> UIColor in
switch traitCollection.userInterfaceStyle {
case .light:
return UIColor.black
case .dark:
return UIColor.white
default:
fatalError()
}
}
label.textColor = labelColor
現(xiàn)在戴尸,我們做完了背景色和文本顏色的適配,接下來我們看看圖片如何適配
圖片適配
打開 Assets.xcassets
把圖片拖拽進去冤狡,我們可以看到這樣的頁面
然后我們在右側工具欄中點擊最后一欄孙蒙,點擊 Appearances
選擇 Any, Dark
,如圖所示
我們把 DarkMode 的圖片拖進去悲雳,如圖所示
最后我們加上 ImageView
的代碼
imageView.image = UIImage(named: "icon")
現(xiàn)在我們就已經完成顏色和圖片的 DarkMode 適配挎峦,是不是很簡單呢 (手動滑稽)
如何獲取當前樣式 (Light or Dark)
我們可以看到,不管是顏色還是圖片合瓢,適配都是系統(tǒng)完成的坦胶,我們不用關心現(xiàn)在是什么樣的樣式。
但是在某些場景下晴楔,我們可能會有根據(jù)當前樣式來做一些其他適配的需求顿苇,這時我們就需要知道現(xiàn)在什么樣式。
我們可以在 UIViewController
或 UIView
中調用 traitCollection.userInterfaceStyle
來獲取當前樣式税弃,代碼如下
switch traitCollection.userInterfaceStyle {
case .unspecified:
print("unspecified")
case .light:
print("light")
case .dark:
print("dark")
}
為什么要強調當前呢纪岁,因為默認情況下使用 traitCollection.userInterfaceStyle
屬性就能獲取到當前系統(tǒng)的樣式。
但是我們可以通過 overrideUserInterfaceStyle
屬性強制設置 UIViewController
或 UIView
的樣式则果,代碼如下
overrideUserInterfaceStyle = .dark
print(traitCollection.userInterfaceStyle) // dark
我們可以看到設置了 overrideUserInterfaceStyle
之后幔翰,traitCollection.userInterfaceStyle
就是設置后的樣式了。
注意:overrideUserInterfaceStyle
默認值為 unspecified
西壮,所以一定要用 traitCollection.userInterfaceStyle
來判斷當前樣式遗增,而不是用 overrideUserInterfaceStyle
來判斷。
注意:以上代碼是我自己摸索出來的款青,在真機上也能達到效果做修,但是不建議現(xiàn)在就開始做 DarkMode 的適配。畢竟官方關于 DarkMode 適配的 session 還沒出,建議等 session 出了之后在做適配缓待,另外如果有和官方有出入我會及時補充修改~
作者:RayJiang97
鏈接:http://www.reibang.com/p/e6616e44cf60