如何检查iOS / iPadOS中是否启用了暗模式?

时间:2019-06-03 23:34:57

标签: ios ios13 ipados ios-darkmode

从iOS / iPadOS 13开始,提供了深色用户界面样式,类似于macOS Mojave中引入的深色模式。如何检查用户是否已启用系统范围的暗模式?

16 个答案:

答案 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元素(例如UIViewControllerUITabBar)将自动适应新的用户界面样式。

答案 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)

SwiftUI

使用\.colorScheme变量的Environment键:

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

    var body: some View {
        Text(colorScheme == .dark ? "In dark mode" : "In light mode")
    }
}

此外,它会自动更新环境配色方案。


UIKit

要检查当前内容,所有符合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
}

就像自Mojave以来在macOS中一样,您可以在资产目录中为亮和暗模式定义图像,以便可以自动使用这些图像:

答案 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