在 iOS 中,UIUserInterfaceStyle
是一个枚举类型,用于表示用户界面的外观样式(Appearance)。它支持两种主要模式:
light
:浅色模式。dark
:深色模式。unspecified
:未指定模式,通常由系统自行决定。
UIUserInterfaceStyle
是 iOS 13 中引入的,旨在帮助开发者支持系统级别的浅色和深色模式。
UIUserInterfaceStyle 的适用场景 #
- 检测当前界面的外观样式,以动态适配颜色和设计。
- 强制为特定的视图或应用设置浅色/深色模式。
- 根据用户偏好或系统设置自定义应用的外观。
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.label
和 UIColor.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 | 未指定模式(通过系统决定界面样式) |
设置优先级 #
应用和系统样式之间存在优先级:
- 如果设置了
overrideUserInterfaceStyle
,该视图或应用会强制使用指定样式。 - 如果未设置
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
}
}
}
注意事项 #
系统默认行为:
- 默认情况下应用会跟随系统的样式变化。
- 如果需要自定义,可以在特定视图或全局配置中覆盖样式。
测试切换模式:
- 在 iPhone 模拟器中,可以通过快捷键 Cmd + Shift + A 切换浅色和深色模式。
- 在真实设备上,可以从设置中开启/关闭深色模式。
AppStore 要求:
- 从 iOS 13 开始,AppStore 中的应用应该支持深色模式。
- 如果暂时不支持,可以通过
Info.plist
禁用深色模式:<key>UIUserInterfaceStyle</key> <string>Light</string>
总结 #
UIUserInterfaceStyle
是 iOS 支持浅色和深色模式的重要工具。你可以通过它:
- 检测用户界面当前的样式;
- 为视图或整个应用指定特定样式;
- 动态适配用户界面的颜色和布局。
如果希望提供更好的用户体验,建议让你的应用无缝支持暗黑模式并动态适配用户的选择。