iOS OC&&Swift 暗黑模式適配(結(jié)合實踐)

官方文檔 有興趣的可以康康

Supporting Dark Mode in Your Interface
Providing Images for Different Appearances

系統(tǒng)預(yù)設(shè)顏色

雖然系統(tǒng)有自帶暗黑模式的顏色,但是吧,但凡稍微有個活著的UI,咱也別顯著這么寒磣不是。但還是放出來給大家康康叭,跟一般的[UIColor redColor]/.red一個用法。
使用系統(tǒng)預(yù)設(shè)定好的顏色類型。示例如下:

    button.setTitleColor(.label, for: .normal)
    button.backgroundColor = .systemBackground

OC:

@property (class, nonatomic, readonly) UIColor *systemBrownColor        API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *systemIndigoColor       API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *systemGray2Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemGray3Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemGray4Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemGray5Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemGray6Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *labelColor              API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *secondaryLabelColor     API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *tertiaryLabelColor      API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *quaternaryLabelColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *linkColor               API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *placeholderTextColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *separatorColor          API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *opaqueSeparatorColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchOS);
@property (class, nonatomic, readonly) UIColor *systemBackgroundColor                   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *secondarySystemBackgroundColor          API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *tertiarySystemBackgroundColor           API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemGroupedBackgroundColor            API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *secondarySystemGroupedBackgroundColor   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *tertiarySystemGroupedBackgroundColor    API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *systemFillColor                         API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *secondarySystemFillColor                API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *tertiarySystemFillColor                 API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);
@property (class, nonatomic, readonly) UIColor *quaternarySystemFillColor               API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchOS);

Swift: 參考OC

項目中實用的方法

  1. 在工具類定義iOS13暗黑顏色適配的方法
    OC:
// MARK: - iOS 13 暗黑模式顏色適配
func ios13ColorWithDark(_ darkColor: UIColor, _ defaultColor:UIColor) -> UIColor {
    
    if #available(iOS 13.0, *) {
        let colorDynamic = UIColor.init { (traitCollection) -> UIColor in
            if (traitCollection.userInterfaceStyle == .dark) {
                return darkColor
            } else {
                return defaultColor
            }
        }
        return colorDynamic
    }
    return defaultColor
}

Swift:

// MARK: - iOS 13 暗黑模式顏色適配
func ios13ColorWithDark(_ darkColor: UIColor, _ defaultColor:UIColor) -> UIColor {
    
    if #available(iOS 13.0, *) {
        let colorDynamic = UIColor.init { (traitCollection) -> UIColor in
            if (traitCollection.userInterfaceStyle == .dark) {
                return darkColor
            } else {
                return defaultColor
            }
        }
        return colorDynamic
    }
    return defaultColor
}

  1. 判斷是否是暗黑模式
    OC:
    if (@available(iOS 13.0, *)) {
        
        // 判斷是否是暗黑模式
        BOOL isDark = (self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark);

        if (isDark) {

        }
    }

Swift:

        if #available(iOS 13.0, *) {

            // 判斷是否是暗黑模式
            let isDark = self.traitCollection.userInterfaceStyle == .dark

            if (isDark) {

            }
        }

  1. 如果碰到 Light Mode 和 Dark Mode 相互切換設(shè)置的顏色不起作用,需要在監(jiān)聽模式切換的指定方法,另外進(jìn)行設(shè)置。
    OC:
- (UITraitCollection *)traitCollection{

}

Swift:

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        
}
  1. 關(guān)于顏色
    通過 Assets.xcassets -> 添加 New Color Set ,設(shè)置 Appearances 為自己所需要的類型,進(jìn)行 light 和 dark 模式下不同的顏色設(shè)置,即可使用。示例代碼如下:
    button.backgroundColor = UIColor.init(named: "ColorBackground")
image.png

或者純代碼定義
OC:

 if (@available(iOS 13.0, *)) {
        UIColor *dynamicColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
            if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
                return [UIColor greenColor];
            }
            else {
                return [UIColor blueColor];
            }
        }];
        [self.view.backgroundColor setBackgroundColor:dynamicColor];
    }

Swift:

           if #available(iOS 13.0, *) {
                let dynamicColor = UIColor.init { (trainCollection) -> UIColor in
                    if self.traitCollection.userInterfaceStyle == .light {
                        return .green
                    } else {
                        return .blue
                    }
                }
                self.view.backgroundColor = dynamicColor
            }
  1. 關(guān)于圖片
    在 Assets .xcassets 里,可以創(chuàng)建New Image Set,根據(jù)需要對圖片進(jìn)行命名和設(shè)置即可。示例代碼如下:
    imageView.image = UIImage.init(named: "LOrDImage")
image.png

其他代碼參照第四點。

設(shè)置 Light/Dark 模式

如果需要單獨設(shè)置展示模式,不跟隨系統(tǒng)設(shè)置變化的話~

    // Always adopt a light interface style.    
    overrideUserInterfaceStyle = .light
模擬器設(shè)置暗黑模式測試
 設(shè)置->Developer(開發(fā)者)->Dark Appearance
通過指定方法去更新自定義視圖

當(dāng)用戶更改系統(tǒng)外觀時,系統(tǒng)會自動要求每個窗口和視圖重新繪制。蘋果官方建議,在這些指定的方法去修改顏色,因為如果在創(chuàng)建時設(shè)置 layer 的顏色之類的,會因為 CGColorRef 對象不適應(yīng)而不發(fā)生改變,創(chuàng)建時設(shè)置背景顏色什么倒是可以的。示例如下:

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        
        label.layer.borderWidth = 2
        label.layer.borderColor = UIColor.init(named: "LabelBorder")?.cgColor
    }
1585647459360.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內(nèi)容