为什么我的 iOS 应用程序不禁用深色模式?

Why doesn't my iOS app disable dark mode?

所以...我尝试根据苹果文档通过强制亮模式来设置我的应用程序以禁用 iOS 13 暗模式,在模拟器中所有尝试都工作正常,但是当我尝试真实设备,没有任何反应,就像我从未更改过我的代码

第一次尝试

覆盖 Window、视图或视图控制器的界面样式

我试图将此代码示例放入我的 viewDidLoad()

没有变化

if #available(iOS 13.0, *) {
   overrideUserInterfaceStyle = .light
} else {
  // Fallback on earlier versions
}

第二次尝试

完全退出深色模式

系统会自动选择链接到 iOS 13.0 或更高版本 SDK 的任何应用程序,以同时显示浅色和深色外观。如果您需要额外的时间来处理应用程序的深色模式支持,您可以通过在应用程序的 Info.plist 文件中包含 UIUserInterfaceStyle 键(值为 Light)来暂时选择退出。将此键设置为 Light 会导致系统忽略用户的偏好并始终为您的应用程序应用浅色外观。

没有变化

Apple Documentation: Choosing a Specific Interface Style for Your iOS App

如果有人知道我是如何将我的应用程序设置为仅在轻模式下...我将不胜感激:D

if #available(iOS 13, *) {
    window.overrideUserInterfaceStyle = .light
}

应该可以。在你的 AppDelegatedidFinishLaunchingWithOptions.

中调用它

只需在您的应用程序中添加一个新密钥UIUserInterfaceStyle info.plist(注意:Xcode12及以上已重命名为Appearance)并将其值设置为Light or Dark。这会将应用默认样式覆盖为您提供的值。

因此您无需为将它放在其他地方而烦恼

为 iOS 13+ 版本更改 window UserInterfaceStyle。只需设置

UIApplication.shared.changeStatusBarStyle(.light)

UIApplication.shared.changeStatusBarStyle(.dark)

每次更改后window。

extension UIApplication {

        enum StatusColor {

            case dark, light
        }

        func changeStatusBarStyle(_ mode: StatusColor = .light) {

            if #available(iOS 13.0, *) {

                guard let appDelegate = delegate as? AppDelegate else { return }

                var interfaceStyle: UIUserInterfaceStyle

                switch mode {
                case .dark:
                    interfaceStyle = .dark
                default:
                    interfaceStyle = .light
                }

                appDelegate.window?.overrideUserInterfaceStyle = interfaceStyle
            }
        }
    }

如果有任何困惑,请告诉我。

内加Info.plist

<key>Appearance</key>
<string>Light</string>

对于 SwiftUI,您可能会发现以下解决方案很有帮助:

extension UIApplication {
    func changeInterfaceStyle(_ mode: UIUserInterfaceStyle = .light) {
        if #available(iOS 13.0, *) {
            var window: UIWindow? {
                guard let scene = connectedScenes.first,
                      let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate,
                      let window = windowSceneDelegate.window else {
                    return nil
                }
                return window
            }
            window?.overrideUserInterfaceStyle = mode
        }
    }
}

用法:

    Button("Dark") {
        UIApplication.shared.changeInterfaceStyle(.dark)
    }