UIKit — UIUserInterfaceStyle

在 iOS 中,UIUserInterfaceStyle 是一个枚举类型,用于表示用户界面的外观样式(Appearance)。它支持两种主要模式:

  1. light:浅色模式。
  2. dark:深色模式。
  3. unspecified:未指定模式,通常由系统自行决定。

UIUserInterfaceStyle 是 iOS 13 中引入的,旨在帮助开发者支持系统级别的浅色和深色模式。


UIUserInterfaceStyle 的适用场景 #

  1. 检测当前界面的外观样式,以动态适配颜色和设计。
  2. 强制为特定的视图或应用设置浅色/深色模式。
  3. 根据用户偏好或系统设置自定义应用的外观。

UIUserInterfaceStyle 的使用方法 #

1. 检测当前界面的样式 #

UIUserInterfaceStyle 可以从当前 UITraitCollection 中读取,该集合包含了当前环境下的用户界面配置。

以下示例展示了如何检查当前的界面样式:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)

    if traitCollection.userInterfaceStyle == .dark {
        print("当前是深色模式")
    } else {
        print("当前是浅色模式")
    }
}

用途: #

  • 当用户从浅色模式切换到深色模式时,可以实时检测并动态响应。

2. 强制指定某个界面样式 #

如果想为某个视图或控制器始终使用浅色或深色模式,而不受系统设置影响,可以通过设置 overrideUserInterfaceStyle 来强制指定样式。

示例代码:强制单个视图使用浅色模式 #
class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // 强制指定浅色模式
        overrideUserInterfaceStyle = .light
    }
}
示例代码:强制单个视图使用深色模式 #
class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // 强制指定深色模式
        overrideUserInterfaceStyle = .dark
    }
}

3. 为整个应用设置统一的界面样式 #

从 iOS 13 开始,可以通过 window.overrideUserInterfaceStyle 为整个应用设置统一的界面样式。

示例代码:在 SceneDelegate 或 AppDelegate 中设置 #
// 在 SceneDelegate 中
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)
        window.overrideUserInterfaceStyle = .dark // 全局使用深色模式
        self.window = window
        window.makeKeyAndVisible()
    }
}

注意#

  • 用户设置的系统外观样式(浅色/深色模式)通过 UIUserInterfaceStyle.unspecified 表示,应用即会遵循系统设置。
  • 强制设置应用样式会覆盖系统的全局外观。

4. 在 SwiftUI 中使用 #

在 SwiftUI 中,可以使用 colorScheme 环境变量来检查或更改用户界面样式。

检测当前样式 #
import SwiftUI

struct ContentView: View {
    @Environment(\.colorScheme) var colorScheme

    var body: some View {
        Text(colorScheme == .dark ? "深色模式" : "浅色模式")
    }
}
强制指定样式 #
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("强制设置浅色模式")
            .preferredColorScheme(.light) // 强制浅色模式
    }
}

5. 自定义动态颜色 #

通过 UIUserInterfaceStyle,可以实现界面在不同样式下使用不同的颜色。

方法 1:使用系统动态颜色 #

iOS 提供了 UIColor 的动态颜色,例如 UIColor.labelUIColor.systemBackground,它们会自动适配浅色和深色模式。

view.backgroundColor = UIColor.systemBackground // 自动适配模式
方法 2:自定义动态颜色 #

也可以通过 UIColor { traitCollection in ... } 自定义动态颜色。

let dynamicColor = UIColor { traitCollection in
    return traitCollection.userInterfaceStyle == .dark ? UIColor.black : UIColor.white
}
view.backgroundColor = dynamicColor

UIUserInterfaceStyle 的值 #

枚举成员 #

枚举值描述
.light浅色模式
.dark深色模式
.unspecified未指定模式(通过系统决定界面样式)

设置优先级 #

应用和系统样式之间存在优先级:

  1. 如果设置了 overrideUserInterfaceStyle,该视图或应用会强制使用指定样式。
  2. 如果未设置 overrideUserInterfaceStyle,系统设置会生效:
    • 用户可在系统设置中启用自动切换模式(如根据昼夜时间切换)。

动态切换示例 #

以下代码展示了如何响应用户模式的变化并动态切换界面配色:

import UIKit

class DynamicModeViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        updateAppearance()
    }

    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)
        
        if traitCollection.hasDifferentColorAppearance(comparedTo: previousTraitCollection) {
            updateAppearance() // 切换界面外观
        }
    }

    func updateAppearance() {
        view.backgroundColor = UIColor { traitCollection in
            return traitCollection.userInterfaceStyle == .dark ? .black : .white
        }
    }
}

注意事项 #

  1. 系统默认行为

    • 默认情况下应用会跟随系统的样式变化。
    • 如果需要自定义,可以在特定视图或全局配置中覆盖样式。
  2. 测试切换模式

    • 在 iPhone 模拟器中,可以通过快捷键 Cmd + Shift + A 切换浅色和深色模式。
    • 在真实设备上,可以从设置中开启/关闭深色模式。
  3. AppStore 要求

    • 从 iOS 13 开始,AppStore 中的应用应该支持深色模式。
    • 如果暂时不支持,可以通过 Info.plist 禁用深色模式:
      <key>UIUserInterfaceStyle</key>
      <string>Light</string>
      

总结 #

UIUserInterfaceStyle 是 iOS 支持浅色和深色模式的重要工具。你可以通过它:

  • 检测用户界面当前的样式;
  • 为视图或整个应用指定特定样式;
  • 动态适配用户界面的颜色和布局。

如果希望提供更好的用户体验,建议让你的应用无缝支持暗黑模式并动态适配用户的选择。

本文共 1557 字,上次修改于 Jan 19, 2025