iOS 13系統(tǒng)的問世押桃,開啟了App的深色模式的大門捷绒。2002年3月4日更新的AppStore審核指南提出:從2020年4月30日開始,所有提交至App Store的iPhone App都須使用iOS 13 SDK或更高版本來構(gòu)建涯冠。之前也有聽聞?wù)f如果應(yīng)用不支持暗黑模式的將要被強(qiáng)制下架拣挪。目前,我提交的app直接設(shè)置了不支持暗黑模式宵晚,
if #available(iOS 13.0, *) {
self.window?.overrideUserInterfaceStyle = .light
} else {
// Fallback on earlier versions
}
但那是還沒有收到一些強(qiáng)制性的要求恨旱,不過還是要有所準(zhǔn)備。
我把iOS13系統(tǒng)提供的顏色做一個(gè)記錄坝疼,方便以后在適配顏色的時(shí)候方便查看。這些顏色是會(huì)根據(jù)暗黑模式來改變谆沃。
目錄:
一钝凶、暗黑模式須知
1、 UIUserInterfaceStyle(頁(yè)面模式的枚舉)
2、暗黑模式監(jiān)聽
3耕陷、獲取當(dāng)前模式二掂名、iOS 13新增 UIColor及效果圖
1、 系統(tǒng)提供的動(dòng)態(tài)顏色
2哟沫、 系統(tǒng)提供的動(dòng)態(tài)顏色的視覺圖三饺蔑、自定義不同模式下UIColor
1、系統(tǒng)提供創(chuàng)建動(dòng)態(tài)顏色的方法
2嗜诀、創(chuàng)建動(dòng)態(tài)顏色四猾警、使用Assets.xcassets 里面New Color Set設(shè)置顏色(
推薦
)1、創(chuàng)建Color Set
2隆敢、創(chuàng)建設(shè)置名稱和不同模式下的顏色
3发皿、代碼中使用
4、運(yùn)行結(jié)果展示
我在iOS13 新API和出現(xiàn)的問題這一篇的末尾處也提到過拂蝎,這里在提一下穴墅。
一、暗黑模式須知
1温自、 UIUserInterfaceStyle
(頁(yè)面模式的枚舉)
@available(iOS 12.0, *)
public enum UIUserInterfaceStyle : Int {
///未指定模式
case unspecified
///光亮模式
case light
///暗黑模式
case dark
}
2玄货、暗黑模式監(jiān)聽
///監(jiān)聽模式的變化
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
//模式發(fā)生變化會(huì)回調(diào)這里
}
}
3、獲取當(dāng)前模式
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滥沫、 系統(tǒng)提供的動(dòng)態(tài)顏色
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、 系統(tǒng)提供的動(dòng)態(tài)顏色的視覺圖
下圖為我在不同模式下上面顏色的展示情況:
注:我沒有設(shè)置字體和字體的顏色键俱,都是使用默認(rèn)的兰绣。在dark模式向下所有的字體均變?yōu)榱税咨?/code>根據(jù)這個(gè)圖,可以很方便的選擇我們所需的顏色编振,如果沒有達(dá)到要求缀辩,請(qǐng)使用下面的方法來自定義顏色。
三、自定義不同模式下UIColor
1臀玄、系統(tǒng)提供創(chuàng)建動(dòng)態(tài)顏色的方法
extension UIColor {
///根據(jù)不同的模式返回不同的顏色
@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. 根據(jù)已經(jīng)設(shè)置的模式來返回顏色
*/
@available(iOS 13.0, *)
open func resolvedColor(with traitCollection: UITraitCollection) -> UIColor
}
2瓢阴、創(chuàng)建動(dòng)態(tài)顏色
- 此方法為如果是iOS13就返回系統(tǒng)提供的動(dòng)態(tài)顏色
func lgl_color() -> UIColor {
if #available(iOS 13.0, *) {//iOS13及以上
return UIColor.systemBackground//(這里修改iOS13<系統(tǒng)的動(dòng)態(tài)顏色)
} else {//iOS13以下的
return UIColor.red //(這里修改iOS13>系統(tǒng)的顏色)
}
}
- 此方法為完全指定你想要的設(shè)置的顏色,是上個(gè)方法的升級(jí)版健无,使用到了
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
}
}
- 以下方法是根據(jù)不同的模式來獲取某個(gè)動(dòng)態(tài)顏色所展示的顏色荣恐,使用到了
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設(shè)置顏色
在xcode9累贤,iOS11
及以后在Assets.xcassets里面新增了一個(gè)Color Set來設(shè)置顏色叠穆,用起來也是比較方便。
1畦浓、創(chuàng)建Color Set
創(chuàng)建方法如下圖所示:
2痹束、創(chuàng)建設(shè)置名稱和不同模式下的顏色
(在使用過程中Appearance選擇 Any,Dark就可以)設(shè)置名稱和顏色具體步驟如下圖所示:
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 {
///設(shè)置低于iOS11系統(tǒng)下展示的顏色
llView.backgroundColor = UIColor.red
}
self.view.addSubview(llView)
4祷嘶、運(yùn)行結(jié)果展示
注:在iOS13的系統(tǒng)下,如果沒有設(shè)置模試夺溢,或者是設(shè)置成unspecified论巍,展示跟Light Appearance同一顏色,低于iOS13系統(tǒng)下展示的就是 Any Appearance 所展示的顏色
以上就是對(duì)iOS13對(duì)于暗黑模式適配下风响,對(duì)于UIColor的一點(diǎn)記錄嘉汰,應(yīng)該可以滿足適配顏色的需求了????