iOS 13是否可以取消暗黑模式?

490

我的应用程序的大部分功能是通过网页视图实现的,以提供尚未通过本地实现可用的功能。网页团队没有计划为网站实现深色主题。因此,在iOS 13上,我的应用程序将呈现半深/半浅的样式。

是否可以选择退出暗模式支持,使我们的应用程序始终显示浅色模式,以匹配网站主题?


116
请在Info.Plist文件中将UIUserInterfaceStyle设置为“Light”。详见https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW44 - Tieme
3
谢谢你的提问 - 代表我们所有人。有很多应用需要处理。这是必要的,以保持应用程序正常工作,直到切换准备就绪。 - user3741598
导入基础框架 导入用户界面框架扩展UIViewController {override open func awakeFromNib() { super.awakeFromNib() if #available(iOS 13.0, *) { //始终采用浅色界面样式。 overrideUserInterfaceStyle = .light } }} - Mohammad Razipour
1
只需在plist中添加UIUserInterfaceStyle即可。非常简单。 - Fattie
@kiran - 是的,我刚为一个TF构建做了这件事。 - benc
显示剩余2条评论
30个回答

1091

首先,这里是与退出深色模式相关的苹果入口

该链接的内容适用于Xcode 11和iOS 13:

通过info.plist文件设置整个应用程序(Xcode 12)

在您的info.plist文件中使用以下键:

UIUserInterfaceStyle

将其赋值为Light

UIUserInterfaceStyle分配的XML

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

UIUserInterfaceStyle的Apple文档


通过构建设置中的info.plist设置整个应用程序(Xcode 13)

enter image description here


通过窗口属性设置整个应用程序窗口

您可以针对应用程序的window变量设置overrideUserInterfaceStyle。这将适用于出现在窗口内的所有视图。这在iOS 13中可用,因此对于支持之前版本的应用程序,必须包括可用性检查。

根据项目的创建方式,此可能位于AppDelegateSceneDelegate文件中。

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

单个 UIViewController 或者 UIView

您可以针对 UIViewController 或者 UIViewoverrideUserInterfaceStyle 变量设置 overrideUserInterfaceStyle。这在 iOS 13 中可用,因此对于支持旧版本的应用程序,您必须包含一个可用性检查。

Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // overrideUserInterfaceStyle is available with iOS 13
    if #available(iOS 13.0, *) {
        // Always adopt a light interface style.
        overrideUserInterfaceStyle = .light
    }
}

对于那些受制于 Objective-C 的可怜伙计

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

UIViewController相比,视图控制器及其子级采用定义的模式。

UIView相比,视图及其子级采用定义的模式。

overrideUserInterfaceStyle的苹果文档


通过SwiftUI View设置各个视图

您可以将preferredColorScheme设置为lightdark。提供的值将设置演示的颜色方案。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Light Only")
            .preferredColorScheme(.light)
    }
}

有关preferredColorScheme的苹果文档


感谢@Aron Nelson@Raimundas Sakalauskas@NSLeader@rmaddy通过他们的反馈改进了这个答案。


3
现在更新/上传您的应用程序时,UIUserInterfaceStyle light被阻止了。它被标记为无效的plist条目。(无效的plist键) - Aron Nelson
2
这段代码无法在iOS SDK 12(目前最新的稳定SDK)上编译。请参考https://dev59.com/oVMI5IYBdhLWcg3wS5rP#57521901,了解适用于iOS 12 SDK的解决方案。 - Raimundas Sakalauskas
8
不必在每个视图控制器的 viewDidLoad 中设置 overrideUserInterfaceStyle,而是可以在应用程序的主窗口上设置一次。如果您希望整个应用程序以一种方式行为,则会更加容易。 - rmaddy
2
请使用 #if compiler(>=5.1) 替代 responds(to:)setValue - NSLeader
16
Info.plist中的关键字已更改为Appearance<key> Appearance </key> <string> Light </string> - huync
显示剩余11条评论

166
根据苹果公司“在iOS上实现暗黑模式”的视频演示(https://developer.apple.com/videos/play/wwdc2019/214/,从31:13开始),你可以在任何视图控制器或视图上设置overrideUserInterfaceStyleUIUserInterfaceStyleLightUIUserInterfaceStyleDark,这将用于任何子视图或视图控制器中的traitCollection
如SeanR所提到的,在应用程序的plist文件中设置UIUserInterfaceStyleLightDark可以更改整个应用程序的主题。

21
如果您设置了UIUserInterfaceStyle键,您的应用程序将在App Store中被拒绝。 - Sonius
2
苹果公司以ITMS-90190错误代码拒绝 - PRASAD1240
12
由于iOS 13 SDK仍未正式发布,因此最可能会出现拒绝操作。我认为一旦Xcode 11 GM可用,这个问题应该就能解决。 - dorbeetle
2
@dorbeetle 这不是真的,我一个月前使用 Xcode 10 成功地上传了我的应用程序。最近发生的拒绝似乎是由于苹果采取了某种新策略。 - steven
听到被拒绝的消息总是让人感到奇怪。关于iOS 13文档,它指出需要在Info.plist中设置“UIUserInterfaceStyle”键。 - dpart
1
仍然发生着。Xcode GM2 返回应用签名错误。Xcode 10.3 返回:"Invalid Info.plist Key. The key 'UIUserInterfaceStyle' in the Payload/Galileo.appInfo.plist file is not valid." - Evgen Bodunov

75
如果您没有使用Xcode 11或更高版本(即iOS 13或更高版本SDK),您的应用程序尚未自动选择支持深色模式。因此,无需退出深色模式。
如果您使用的是Xcode 11或更高版本,则系统已自动为您的应用程序启用了深色模式。根据您的喜好,有两种方法可以禁用深色模式。您可以完全禁用它,也可以为任何特定窗口、视图或视图控制器禁用它。
完全禁用应用程序的深色模式
您可以在应用程序的Info.plist文件中包含UIUserInterfaceStyle键,并将其值设置为Light,以禁用深色模式。 UIUserInterfaceStyle as 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

窗口:

/* Everything in the window adopts the style, 
 including the root view controller and all presentation controllers that 
 display content in that window.*/
window.overrideUserInterfaceStyle = .light

注意:苹果强烈建议您的应用支持暗黑模式。因此,您只能暂时禁用暗黑模式。
阅读更多:为iOS应用程序选择特定的界面样式

4
在XCode 12.4中,“Appearance”代替了“User Interface Style”。 - Schwarz Software

54

Xcode 12和iOS 14更新。我尝试了以前的选择来退出深色模式,但在info.plist文件中的这个句子对我不起作用:

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

现在它已被重命名为:

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

此设置将阻止全应用程序的所有深色模式。

编辑:

感谢@sarah指出的错别字已经修正。


1
有一点打错了,应该是外观 :) - sarah

47

********** Xcode 11 及以上版本的最简单方法 ***********

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

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

1
当使用Xcode 10.x提交应用程序时,此解决方案将失败。 - Tawfik Bouabid

33

1
通过将值设置为2来强制启用深色模式并不起作用:[UIInterfaceStyle] '2' 不是 UIUserInterfaceStyle 的可识别值。默认为浅色模式。 - funkenstrahlen
3
如果在 plist 文件中有这个密钥,将导致应用程序被 App Store 拒绝。 - José
1
AppStore不再拒绝plist.info中的此属性。我使用了“Dark”(大写),因为我们的应用程序已经是暗色主题。没有问题。这个属性可以让我们使用系统控件。 - nickdnk
@nickdnk 我认为你是用苹果推荐的 Xcode 11 来构建你的应用程序。 - DawnSong
1
是的,我做了。但这并不改变苹果在plist中接受此参数的事实,这正是我想要表明的。 - nickdnk
1
我已经尝试设置“LIGHT”,“Light”,“light”,“.light”,“1” - 但都一样 - 它不起作用。Xcode:版本11.3.1(11C504) - Andrew_STOP_RU_WAR_IN_UA

26

如果你想退出整个应用程序,上面的答案是可行的。如果你正在开发具有用户界面的库,并且没有编辑 .plist 的特权,那么你也可以通过代码来实现。

如果你正在编译iOS 13 SDK,你可以简单地使用以下代码:

Swift:

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

Objective-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"];
    }
}

如果您指定overrideUserInterfaceStyle属性属于哪个对象,会更好。 - DawnSong

26

整个应用程序: (在 info.plist文件中):

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

属性列表


窗口(通常是整个应用程序):

window!.overrideUserInterfaceStyle = .light

您可以从SceneDelegate获取窗口。


UIViewController:

viewController.overrideUserInterfaceStyle = .light
你可以设置任何视图控制器(viewController),即使在该视图控制器内部。

UIView:

view.overrideUserInterfaceStyle = .light

您可以设置任何视图,甚至在视图本身内部。

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


SwiftUI视图:

.preferredColorScheme(.light) <- This Modifier
或者
.environment(\.colorScheme, .light) <- This Modifier

16

Swift 5

您可以使用以下链接下载演示项目:- https://github.com/rashidlatif55/DarkLightMode

切换暗黑模式到亮色模式有两种方法:

1- info.plist

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

2- 程序化或运行时

  @IBAction private func switchToDark(_ sender: UIButton){
        UIApplication.shared.windows.first?.overrideUserInterfaceStyle = .dark
    }

15

您可以在Xcode 11中关闭整个应用程序的暗黑模式

  1. 进入 Info.plist
  2. 添加以下内容:

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

Info.plist 将会如下所示...

输入图片描述


1
由于某种原因,它不适用于Xcode版本11.3.1(11C504)。 - Andrew_STOP_RU_WAR_IN_UA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接