在iOS 13上可以选择退出暗模式吗?

时间:2019-06-11 06:37:09

标签: ios13 ios-darkmode

我的应用程序很大一部分由Web视图组成,以提供本机实现尚不可用的功能。 Web团队没有计划为网站实施深色主题。因此,在iOS 13上支持深色模式的情况下,我的应用看上去将只有一半/一半。

是否可以选择不支持暗模式,以便我们的应用始终显示亮模式以匹配网站主题?

28 个答案:

答案 0 :(得分:57)

如果您没有使用Xcode 11或更高版本(即iOS 13或更高版本的SDK),则您的应用尚未自动选择支持暗模式。因此,无需选择退出黑暗模式。

如果您使用的是Xcode 11或更高版本,则系统已自动为您的应用启用暗模式。有两种方法可以根据您的喜好禁用暗模式。您可以完全禁用它,也可以对任何特定的窗口,视图或视图控制器禁用它。

为您的应用完全禁用暗模式

您可以通过在应用的Info.plist文件中添加值为UIUserInterfaceStyle的{​​{1}}键来禁用黑暗模式。
UIUserInterfaceStyle as Light
这会忽略用户的喜好,并始终为您的应用添加亮丽的外观。

为窗口,视图或视图控制器禁用暗模式

通过设置适当的窗口,视图或视图控制器的Light属性,可以强制界面始终以浅色或深色显示。

视图控制器:

overrideUserInterfaceStyle

观看次数:

override func viewDidLoad() {
    super.viewDidLoad()
    /* view controller’s views and child view controllers 
     always adopt a light interface style. */
    overrideUserInterfaceStyle = .light
}

窗口:

// The view and all of its subviews always adopt light style.
youView.overrideUserInterfaceStyle = .light
  

注意:Apple强烈建议您在应用中支持暗模式。所以,   您只能暂时禁用黑暗模式。

在此处了解更多信息:Choosing a Specific Interface Style for Your iOS App

答案 1 :(得分:29)

********** Xcode 11及更高版本的最简单方法***********

</dict></plist>之前将其添加到info.plist

<key>UIUserInterfaceStyle</key>
<string>Light</string>

答案 2 :(得分:21)

如果您要退出整个应用,则上述答案有效。如果您使用的是具有UI的lib,并且您对.plist的编辑并不奢侈,那么也可以通过代码来实现。

如果要使用iOS 13 SDK进行编译,则只需使用以下代码即可:

迅速:

if #available(iOS 13.0, *) {
    self.overrideUserInterfaceStyle = .light
}

Obj-C:

if (@available(iOS 13.0, *)) {
    self.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}

但是,如果您也希望代码针对 iOS 12 SDK 进行编译(目前仍是最新的稳定SDK),则应使用选择器。带选择器的代码:

Swift(XCode将显示此代码的警告,但这是目前唯一的方法,因为SDK 12中不存在该属性,因此无法编译):

if #available(iOS 13.0, *) {
    if self.responds(to: Selector("overrideUserInterfaceStyle")) {
        self.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

Obj-C:

if (@available(iOS 13.0, *)) {
    if ([self respondsToSelector:NSSelectorFromString(@"overrideUserInterfaceStyle")]) {
        [self setValue:@(UIUserInterfaceStyleLight) forKey:@"overrideUserInterfaceStyle"];
    }
}

答案 3 :(得分:16)

Xcode 12和iOS 14更新。我已经尝试了以前的选项来选择退出黑暗模式,而info.plist文件中的这句话对我不起作用:

<key>UIUserInterfaceStyle</key>
<string>Light</string>

现在将其重命名为:

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

此设置将阻止整个应用程序中的所有黑暗模式。

已编辑:

修正了错字,谢谢@sarah

答案 4 :(得分:12)

最新更新-

如果您使用的是Xcode 10.x,则iOS 13.x的默认UIUserInterfaceStylelight。在iOS 13设备上运行时,它将仅在灯光模式下工作。

无需在Info.plist文件中显式添加UIUserInterfaceStyle键,添加它会在验证应用程序时出现错误,提示:

  

无效的Info.plist键。 Payload / AppName.appInfo.plist文件中的键“ UIUserInterfaceStyle”无效。

使用Xcode 11.x时,仅在Info.plist文件中添加UIUserInterfaceStyle键。

答案 5 :(得分:8)

iOS 14.3 和 Xcode 12.3 更新

在 info.plist 文件中将 Appearance 添加为 Light

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

答案 6 :(得分:8)

如果您将UIUserInterfaceStyle键添加到plist文件中,则Apple可能会拒绝此处所述的发行版本:https://stackoverflow.com/a/56546554/7524146 无论如何,明确告诉每个ViewController self.overrideUserInterfaceStyle = .light都是很烦人的。但是,您可以对根window对象使用一次这种和平的代码:

if #available(iOS 13.0, *) {
    if window.responds(to: Selector(("overrideUserInterfaceStyle"))) {
        window.setValue(UIUserInterfaceStyle.light.rawValue, forKey: "overrideUserInterfaceStyle")
    }
}

请注意,您无法在application(application: didFinishLaunchingWithOptions:)内执行此操作,因为对于该选择器,在此早期阶段不会响应true。但是您以后可以做。如果您在应用程序中使用自定义AppPresenterAppRouter类,而不是自动在AppDelegate中启动UI,则超级简单。

答案 7 :(得分:7)

-对于整个应用程序(窗口):

window!.overrideUserInterfaceStyle = .light

您可以从SceneDelegate

获取窗口

-对于单个ViewController:

viewController.overrideUserInterfaceStyle = .light

即使在viewController内部,您也可以设置任何viewController 自己

-对于单个视图:

view.overrideUserInterfaceStyle = .light

即使在视图内部,您也可以设置任何view 自己

如果支持较早的iOS版本,则可能需要使用if #available(iOS 13.0, *) { ,,, }

答案 8 :(得分:6)

除了其他回应之外,据我所知,您仅需要在针对iOS 13 SDK(使用XCode 11)进行编译时为Dark模式做好准备。

  

系统假定应用程序已针对iOS 13或更高版本的SDK进行了链接   支持亮色和深色外观。在iOS中,您可以指定   通过分配特定的界面样式来获得所需的特定外观   到您的窗口,视图或视图控制器。您也可以禁用支持   完全使用Info.plist键即可进入黑暗模式。

Link

答案 9 :(得分:5)

您可以在整个应用程序xcode 11或更高版本中关闭暗模式

  1. 转到Info.plish
  2. 添加波纹管

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>
    

Info.plist看起来像下面的样子。

enter image description here

答案 10 :(得分:4)

根据Apple的“在iOS上实现暗模式”会话(https://developer.apple.com/videos/play/wwdc2019/214/从31:13开始),可以在任意位置将overrideUserInterfaceStyle设置为UIUserInterfaceStyleLightUIUserInterfaceStyleDark视图控制器或视图,将在traitCollection中用于任何子视图或视图控制器。

如SeanR所提到的,您可以在应用程序的plist文件中将UIUserInterfaceStyle设置为LightDark来更改整个应用程序。

答案 11 :(得分:3)

我想我已经找到了解决方案。我最初将其从UIUserInterfaceStyle - Information Property ListUIUserInterfaceStyle - UIKit拼凑而成,但现在发现它实际上已记录在Choosing a specific interface style for your iOS app中。

在您的info.plist中,将UIUserInterfaceStyle用户界面样式)设置为 1 UIUserInterfaceStyle.light)。

编辑:根据dorbeetle的回答,UIUserInterfaceStyle的更合适的设置可能是Light

答案 12 :(得分:3)

将此添加到 info.plist

<key>UIUserInterfaceStyle</key>
    <string>Light</string>

答案 13 :(得分:3)

快捷键5

将暗模式切换为亮模式的两种方法:

1- info.plist

    <key>UIUserInterfaceStyle</key>
    <string>Light</string>

2-以编程方式或运行时

  @IBAction private func switchToDark(_ sender: UIButton){
        UIApplication.shared.windows.forEach { window in
            //here you can switch between the dark and light
            window.overrideUserInterfaceStyle = .dark
        }
    }

答案 14 :(得分:2)

我的应用程序目前不支持暗模式,并使用浅色应用程序栏颜色。通过向我的Info.plist添加以下密钥,我可以将状态栏内容强制为深色文本和图标:

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

在此处查找其他可能的值:https://developer.apple.com/documentation/uikit/uistatusbarstyle

答案 15 :(得分:2)

Objective-c版本

 if (@available(iOS 13.0, *)) {
        _window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
    }

答案 16 :(得分:2)

是的,您可以通过在viewDidLoad中添加以下代码来跳过:

if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }

答案 17 :(得分:1)

这里有一些提示和技巧,您可以在应用程序中使用它们来支持或绕过黑暗模式。

第一个技巧:覆盖ViewController样式

您可以通过以下方式覆盖UIViewController的界面样式:

  

1:overrideUserInterfaceStyle = .dark //用于黑暗模式

     

2:overrideUserInterfaceStyle = .light //用于灯光模式

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        overrideUserInterfaceStyle = .light    
    }
}

第二条提示:在info.plist中添加密钥

只需添加一个新密钥

  

UIUserInterfaceStyle

在您的应用程序info.plist中

并将其值设置为Light或Dark。这会将应用默认样式覆盖为您提供的值。 您不必在每个viewController中添加overrideUserInterfaceStyle = .light,只需在info.plist中仅添加一行即可。

答案 18 :(得分:1)

只需在您的_has文件中添加以下密钥:

info.plist

答案 19 :(得分:1)

是的..您可以在 iOS 项目中添加以下设置。

在 info.plist 文件中,将 UIUserInterfaceStyle 添加到 Light。

如果你的项目是 IONIC .. 你可以在配置文件中添加以下设置

<platform name="ios">
  <edit-config file="*-Info.plist" mode="merge" target="UIUserInterfaceStyle">
  <string>Light</string>
 </edit-config>
</platform>

使用这些设置,设备暗模式不会影响您的应用。

答案 20 :(得分:0)

在 ViewController.swift 文件中添加 overrideUserInterfaceStyle = .light 或在 info.plist 文件中将 Appearance 更改为“light”

答案 21 :(得分:0)

我将使用此解决方案,因为窗口属性可能会在应用程序生命周期中更改。因此,需要重复分配“ overrideUserInterfaceStyle = .light”。 UIWindow.appearance()使我们能够设置将用于新创建的UIWindow对象的默认值。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

      if #available(iOS 13.0, *) {
          UIWindow.appearance().overrideUserInterfaceStyle = .light
      }

      return true
    }
}

答案 22 :(得分:0)

在Xcode 12中,您可以将添加更改为“外观”。这会工作!

答案 23 :(得分:0)

这个问题有很多答案,您可以像这样在info.plist中设置它,而不是在AppDelegate中使用它:

#if compiler(>=5.1)
        if #available(iOS 13.0, *) {
            self.window?.overrideUserInterfaceStyle = .light
        }
        #endif

在Xcode 11.3,iOS 13.3上测试

答案 24 :(得分:0)

您可以执行以下操作:将这个新键UIUserInterfaceStyle添加到Info.plist并将其值设置为Light。并以灯光模式显示检查警报控制器。

UIUserInterfaceStyle 光 如果在整个应用程序中都处于亮/暗模式,无论用户如何设置,都可以通过将键UIUserInterfaceStyle添加到Info.plist文件并将其值设置为亮或暗来实现。

答案 25 :(得分:0)

import UIKit

extension UIViewController {

    override open func awakeFromNib() {

        super.awakeFromNib()

        if #available(iOS 13.0, *) {

            overrideUserInterfaceStyle = .light

        }

    }
}

答案 26 :(得分:0)

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

答案 27 :(得分:0)

只需将这些行添加到info.plist文件中:

<key>UIUserInterfaceStyle</key>
<string>light</string>

这将强制应用仅在轻模式下运行。