从iOS / iPadOS 13开始,提供了深色用户界面样式,类似于macOS Mojave中引入的深色模式。如何检查用户是否已启用系统范围的暗模式?
答案 0 :(得分:12)
如daveextreme所提到的,当您使用overrideUserInterfaceStyle
属性时,检查当前视图用户界面样式并不总是返回系统样式。在这种情况下,最好使用以下代码:
switch UIScreen.main.traitCollection.userInterfaceStyle {
case .light: //light mode
case .dark: //dark mode
case .unspecified: //the user interface style is not specified
}
答案 1 :(得分:11)
对于 iOS 13 ,您可以使用此属性来检查当前样式是否为暗模式:
if #available(iOS 13.0, *) {
if UITraitCollection.current.userInterfaceStyle == .dark {
print("Dark mode")
}
else {
print("Light mode")
}
}
答案 2 :(得分:7)
您应检查userInterfaceStyle
的{{1}}变量,与在tvOS和macOS上相同。
UITraitCollection
您应该使用switch traitCollection.userInterfaceStyle {
case .light: //light mode
case .dark: //dark mode
case .unspecified: //the user interface style is not specified
}
/ UIView
的{{3}}功能来检测界面环境的变化(包括用户界面样式的变化)。
来自traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?)
:
当iOS界面环境更改时,系统调用此方法。根据您的应用需求,在视图控制器和视图中实现此方法,以响应此类更改。例如,当iPhone从纵向旋转为横向时,您可以调整视图控制器的子视图的布局。此方法的默认实现为空。
系统默认的UI元素(例如UIViewController
或UITabBar
)将自动适应新的用户界面样式。
答案 3 :(得分:7)
您要执行的目标c:
if( self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ){
//is dark
}else{
//is light
}
答案 4 :(得分:4)
1 /对于UIView / UIViewController:
self.traitCollection.userInterfaceStyle == .dark
2 /表示静态或其他:
UITraitCollection.current.userInterfaceStyle == .dark
但是:
//Never use this! You will get wrong value in app extensions (ex. ToDay widget)
UIScreen.main.traitCollection.userInterfaceStyle == .dark //WRONG!
答案 5 :(得分:3)
目标C
要检测何时通过控制中心启用或禁用黑暗模式,请使用“ appDidBecomeActive”通知,该通知将在您返回到应用程序时触发。
//----------------------------------------------------------------------------
// viewWillAppear
//----------------------------------------------------------------------------
- (void)viewWillAppear {
[super viewWillAppear];
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(appDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
完成操作后,别忘了将其删除:
//------------------------------------------------------------------------------------
// viewWillDisappear
//------------------------------------------------------------------------------------
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
在黑暗模式更改时执行所需的操作:
//----------------------------------------------------------------------------
// appDidBecomeActive
//----------------------------------------------------------------------------
-(void)appDidBecomeActive:(NSNotification*)note {
if (@available(iOS 13.0, *)) {
if( self.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark ){
//dark mode
}
else {
//not dark mode
}
}
else {
//fall back for older versions
}
}
答案 6 :(得分:3)
使用\.colorScheme
变量的Environment
键:
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
Text(colorScheme == .dark ? "In dark mode" : "In light mode")
}
}
此外,它会自动更新环境配色方案。
要检查当前内容,所有符合UITraitEnvironment
协议的对象,包括所有UIView
子类和所有UIViewConttroller
子类都可以访问当前样式:
myUIView.traitCollection.userInterfaceStyle == .dark
myUIViewController.traitCollection.userInterfaceStyle == .dark
要检测样式的实时变化,请 here is the full detailed answer
答案 7 :(得分:2)
以下在任何iOS版本上均可使用的Helper方法:
var isDarkMode: Bool {
guard #available(iOS 12.0, *) else {
return false
}
return UIScreen.main.traitCollection.userInterfaceStyle == .dark
}
用法:
view.backgroundColor = isDarkMode ? .black : .white
答案 8 :(得分:1)
检测变化的最佳方法是UIView / UIViewController的traitCollectionDidChange(__ TraitCollection:UITraitCollection?)函数。
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
let userInterfaceStyle = traitCollection.userInterfaceStyle // Either .unspecified, .light, or .dark
// Update your user interface based on the appearance
}
通过在视图控制器上覆盖traitCollectionDidChange,检测外观变化很简单。然后,只需访问视图控制器的traitCollection.userInterfaceStyle。
但是,重要的是要记住,对于其他特征更改(例如设备旋转),可能会调用traitCollectionDidChange。您可以使用此新方法检查当前外观是否不同:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
let hasUserInterfaceStyleChanged = previousTraitCollection.hasDifferentColorAppearance(comparedTo: traitCollection) // Bool
// Update your user interface based on the appearance
}
答案 9 :(得分:1)
您可以使用此扩展名:
import UIKit
extension UIApplication {
@available(iOS 13.0, *)
var userInterfaceStyle: UIUserInterfaceStyle? {
return self.keyWindow?.traitCollection.userInterfaceStyle
}
}
@available(iOS 13.0, *)
func setSystemTheme() {
switch UIApplication.shared.userInterfaceStyle {
case .dark?:
currentTheme = .dark
case .light?:
currentTheme = .light
default:
break
}
}
答案 10 :(得分:0)
一次为写方法创建一个类函数,并在所需的任何地方使用
class func isDarkMode()->Bool{
if #available(iOS 12.0, *) {
if UIScreen.main.traitCollection.userInterfaceStyle == .dark {
return true
} else {
return false
}
} else {
return false
}
}
答案 11 :(得分:0)
对于Swift:
if #available(iOS 12.0, *) {
switch UIScreen.main.traitCollection.userInterfaceStyle {
case .dark: // put your dark mode code here
case .light:
case .unspecified:
}
}
对于目标C:
if (@available(iOS 12.0, *)) {
switch (UIScreen.mainScreen.traitCollection.userInterfaceStyle) {
case UIUserInterfaceStyleDark:
// put your dark mode code here
break;
case UIUserInterfaceStyleLight:
case UIUserInterfaceStyleUnspecified:
break;
default:
break;
}
}
有关更多信息,请观看WWDC2019 video
答案 12 :(得分:0)
也许是一些不错的扩展名?
public extension UIViewController {
@available(iOS 12.0, *)
public var isDarkMode: Bool { traitCollection.userInterfaceStyle == .dark }
}
答案 13 :(得分:0)
您可以使用此方法Swift 5轻松检测暗模式或亮模式
JSON.parse()
答案 14 :(得分:0)
您可以使用以下代码检查项目中的亮模式或暗模式:
func viewDidLoad() {
super.viewDidLoad()
switch traitCollection.userInterfaceStyle {
case .light, .unspecified:
// light mode detected
case .dark:
// dark mode detected
}
}
您还可以检查界面样式的更改:
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
let userInterfaceStyle = traitCollection.userInterfaceStyle // Either .unspecified, .light, or .dark
// Update your user interface based on the appearance
}
答案 15 :(得分:0)
var isDarkMode: Bool {
guard #available(iOS 12.0, *) else {
return false
}
let window = (UIApplication.shared.delegate as? AppDelegate)?.window
return window?.traitCollection.userInterfaceStyle == .dark
}
如果您不使用AppDelegate中的窗口,请从SceneDelegate调用窗口
与上面的大多数答案类似,但是当我们使用更改模式时,效果更好
window?.overrideUserInterfaceStyle = .dark
可以称为
isDarkMode ? .black : .white