我的应用程序的大部分功能是通过网页视图实现的,以提供尚未通过本地实现可用的功能。网页团队没有计划为网站实现深色主题。因此,在iOS 13上,我的应用程序将呈现半深/半浅的样式。
是否可以选择退出暗模式支持,使我们的应用程序始终显示浅色模式,以匹配网站主题?
我的应用程序的大部分功能是通过网页视图实现的,以提供尚未通过本地实现可用的功能。网页团队没有计划为网站实现深色主题。因此,在iOS 13上,我的应用程序将呈现半深/半浅的样式。
是否可以选择退出暗模式支持,使我们的应用程序始终显示浅色模式,以匹配网站主题?
首先,这里是与退出深色模式相关的苹果入口。
该链接的内容适用于Xcode 11和iOS 13:在您的info.plist文件中使用以下键:
UIUserInterfaceStyle
将其赋值为Light
。
UIUserInterfaceStyle
分配的XML:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
您可以针对应用程序的window
变量设置overrideUserInterfaceStyle
。这将适用于出现在窗口内的所有视图。这在iOS 13中可用,因此对于支持之前版本的应用程序,必须包括可用性检查。
根据项目的创建方式,此可能位于AppDelegate
或SceneDelegate
文件中。
if #available(iOS 13.0, *) {
window?.overrideUserInterfaceStyle = .light
}
您可以针对 UIViewController
或者 UIView
的 overrideUserInterfaceStyle
变量设置 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的苹果文档
您可以将preferredColorScheme
设置为light
或dark
。提供的值将设置演示的颜色方案。
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Light Only")
.preferredColorScheme(.light)
}
}
感谢@Aron Nelson、@Raimundas Sakalauskas、@NSLeader和@rmaddy通过他们的反馈改进了这个答案。
viewDidLoad
中设置 overrideUserInterfaceStyle
,而是可以在应用程序的主窗口上设置一次。如果您希望整个应用程序以一种方式行为,则会更加容易。 - rmaddy#if compiler(>=5.1)
替代 responds(to:)
和 setValue
。 - NSLeaderAppearance
。 <key> Appearance </key> <string> Light </string>
- huyncoverrideUserInterfaceStyle
为UIUserInterfaceStyleLight
或UIUserInterfaceStyleDark
,这将用于任何子视图或视图控制器中的traitCollection
。UIUserInterfaceStyle
为Light
或Dark
可以更改整个应用程序的主题。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
Xcode 12和iOS 14更新。我尝试了以前的选择来退出深色模式,但在info.plist文件中的这个句子对我不起作用:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
现在它已被重命名为:
<key>Appearance</key>
<string>Light</string>
此设置将阻止全应用程序的所有深色模式。
编辑:
感谢@sarah指出的错别字已经修正。
********** Xcode 11 及以上版本的最简单方法 ***********
在 </dict></plist>
之前将此添加到 info.plist
<key>UIUserInterfaceStyle</key>
<string>Light</string>
info.plist
中,将UIUserInterfaceStyle
(用户界面样式)设置为1 (UIUserInterfaceStyle.light
)。UIUserInterfaceStyle
的更合适的设置可能是Light
。[UIInterfaceStyle] '2' 不是 UIUserInterfaceStyle 的可识别值。默认为浅色模式。
- funkenstrahlen如果你想退出整个应用程序,上面的答案是可行的。如果你正在开发具有用户界面的库,并且没有编辑 .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
属性属于哪个对象,会更好。 - DawnSonginfo.plist
文件中):<key>UIUserInterfaceStyle</key>
<string>Light</string>
window!.overrideUserInterfaceStyle = .light
您可以从SceneDelegate
获取窗口。
viewController.overrideUserInterfaceStyle = .light
你可以设置任何视图控制器(viewController),即使在该视图控制器内部。
view.overrideUserInterfaceStyle = .light
您可以设置任何视图
,甚至在视图本身内部。
如果您支持早期的iOS版本,则可能需要使用if#available(iOS 13.0,*){...}
。
.preferredColorScheme(.light) <- This Modifier
或者.environment(\.colorScheme, .light) <- This Modifier
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
}
UIUserInterfaceStyle
设置为“Light”。详见https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW44 - Tiemeoverride open func awakeFromNib() { super.awakeFromNib() if #available(iOS 13.0, *) { //始终采用浅色界面样式。 overrideUserInterfaceStyle = .light } }
} - Mohammad Razipour