iOS 13系統的問世,開啟了App的深色模式的大門。2002年3月4日更新的AppStore審核指南提出:從2020年4月30日開始,所有提交至App Store的iPhone App都須使用iOS 13 SDK或更高版本來構建。之前也有聽聞說如果應用不支持暗黑模式的將要被強制下架。目前,我提交的app直接設置了不支持暗黑模式,
if #available(iOS 13.0, *) {
self.window?.overrideUserInterfaceStyle = .light
} else {
// Fallback on earlier versions
}
但那是還沒有收到一些強制性的要求,不過還是要有所準備。
我把iOS13系統提供的顏色做一個記錄,方便以后在適配顏色的時候方便查看。這些顏色是會根據暗黑模式來改變。
目錄:
一、暗黑模式須知
1、 UIUserInterfaceStyle(頁面模式的枚舉)
2、暗黑模式監聽
3、獲取當前模式二、iOS 13新增 UIColor及效果圖
1、 系統提供的動態顏色
2、 系統提供的動態顏色的視覺圖三、自定義不同模式下UIColor
1、系統提供創建動態顏色的方法
2、創建動態顏色四、使用Assets.xcassets 里面New Color Set設置顏色(
推薦
)1、創建Color Set
2、創建設置名稱和不同模式下的顏色
3、代碼中使用
4、運行結果展示
我在iOS13 新API和出現的問題這一篇的末尾處也提到過,這里在提一下。
一、暗黑模式須知
1、 UIUserInterfaceStyle
(頁面模式的枚舉)
@available(iOS 12.0, *)
public enum UIUserInterfaceStyle : Int {
///未指定模式
case unspecified
///光亮模式
case light
///暗黑模式
case dark
}
2、暗黑模式監聽
///監聽模式的變化
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
//模式發生變化會回調這里
}
}
3、獲取當前模式
if self.traitCollection.userInterfaceStyle == .dark {
// Dark
print("是dark模式、。。。")
} else if self.traitCollection.userInterfaceStyle == .light {
// Light
print("是light模式、。。。")
} else {
//unspecified
print("是unspecified模式、。。。")
}
二、iOS 13新增 UIColor及效果圖
1、 系統提供的動態顏色
lazy var colorSource: [UIColor] = {
let source = [UIColor.label,// @available(iOS 13.0, *)
UIColor.secondaryLabel,// @available(iOS 13.0, *)
UIColor.tertiaryLabel,// @available(iOS 13.0, *)
UIColor.quaternaryLabel,// @available(iOS 13.0, *)
UIColor.link,// @available(iOS 13.0, *)
UIColor.placeholderText,// @available(iOS 13.0, *)
UIColor.separator,// @available(iOS 13.0, *)
UIColor.opaqueSeparator,// @available(iOS 13.0, *)
UIColor.systemBackground,// @available(iOS 13.0, *)
UIColor.secondarySystemBackground,// @available(iOS 13.0, *)
UIColor.tertiarySystemBackground,// @available(iOS 13.0, *)
UIColor.systemGroupedBackground,// @available(iOS 13.0, *)
UIColor.secondarySystemGroupedBackground,// @available(iOS 13.0, *)
UIColor.tertiarySystemGroupedBackground,// @available(iOS 13.0, *)
UIColor.systemFill,// @available(iOS 13.0, *)
UIColor.secondarySystemFill,// @available(iOS 13.0, *)
UIColor.tertiarySystemFill,// @available(iOS 13.0, *)
UIColor.quaternarySystemFill,// @available(iOS 13.0, *)
UIColor.systemGray2,//@available(iOS 13.0, *)
UIColor.systemGray3,//@available(iOS 13.0, *)
UIColor.systemGray4,//@available(iOS 13.0, *)
UIColor.systemGray5,//@available(iOS 13.0, *)
UIColor.systemGray6,//@available(iOS 13.0, *)
]
return source
}()
2、 系統提供的動態顏色的視覺圖
下圖為我在不同模式下上面顏色的展示情況:
注:我沒有設置字體和字體的顏色,都是使用默認的。在dark模式向下所有的字體均變為了白色
根據這個圖,可以很方便的選擇我們所需的顏色,如果沒有達到要求,請使用下面的方法來自定義顏色。
三、自定義不同模式下UIColor
1、系統提供創建動態顏色的方法
extension UIColor {
///根據不同的模式返回不同的顏色
@available(iOS 13.0, *)
public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)
/* Resolve any color to its most fundamental form (a non-dynamic color) for a specific trait collection. 根據已經設置的模式來返回顏色
*/
@available(iOS 13.0, *)
open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor
}
2、創建動態顏色
- 此方法為如果是iOS13就返回系統提供的動態顏色
func lgl_color() -> UIColor {
if #available(iOS 13.0, *) {//iOS13及以上
return UIColor.systemBackground//(這里修改iOS13<系統的動態顏色)
} else {//iOS13以下的
return UIColor.red //(這里修改iOS13>系統的顏色)
}
}
- 此方法為完全指定你想要的設置的顏色,是上個方法的升級版,使用到了
public init(dynamicProvider: @escaping (UITraitCollection) -> UIColor)
func lgl_color2() -> UIColor {
if #available(iOS 13.0, *) {//iOS13及以上
return UIColor(dynamicProvider: {(traitCollection) in
switch traitCollection.userInterfaceStyle {
case .light:
return .brown
case .dark:
return .cyan
case .unspecified:
return .green
@unknown default:
return .brown
}
})
} else {//iOS13以下的
return UIColor.red
}
}
- 以下方法是根據不同的模式來獲取某個動態顏色所展示的顏色,使用到了
open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor
///獲取labelColor在traitCollection模式下的展示的顏色
@available(iOS 13.0, *)
func lgl_color3(_ labelColor: UIColor, _ traitCollection: UITraitCollection) -> UIColor {
return labelColor.resolvedColor(with: traitCollection)
}
四、使用Assets.xcassets 里面New Color Set設置顏色
在xcode9,iOS11
及以后在Assets.xcassets里面新增了一個Color Set來設置顏色,用起來也是比較方便。
1、創建Color Set
創建方法如下圖所示:
2、創建設置名稱和不同模式下的顏色
(在使用過程中Appearance選擇 Any,Dark就可以)設置名稱和顏色具體步驟如下圖所示:
3、代碼中使用
let llView = UIView(frame: CGRect(x: 10, y: 100, width: 200, height: 200))
if #available(iOS 11.0, *) {
llView.backgroundColor = UIColor(named: "lgl_test")
} else {
///設置低于iOS11系統下展示的顏色
llView.backgroundColor = UIColor.red
}
self.view.addSubview(llView)
4、運行結果展示
注:在iOS13的系統下,如果沒有設置模試,或者是設置成unspecified,展示跟Light Appearance同一顏色,低于iOS13系統下展示的就是 Any Appearance 所展示的顏色
以上就是對iOS13對于暗黑模式適配下,對于UIColor的一點記錄,應該可以滿足適配顏色的需求了????