Можно ли отказаться от темного режима на iOS 13?
Большая часть моего приложения состоит из веб-представлений для обеспечения функциональности, которая еще не доступна в собственных реализациях. У веб-команды нет планов по реализации темной темы для сайта. Таким образом, мое приложение будет выглядеть наполовину с поддержкой Dark Mode на iOS 13.
Можно ли отказаться от поддержки Dark Mode, чтобы наше приложение всегда отображало светлый режим в соответствии с темой сайта?
29 ответов
В соответствии с сессией Apple "Внедрение темного режима на iOS" ( https://developer.apple.com/videos/play/wwdc2019/214/ начиная с 31:13) можно установить overrideUserInterfaceStyle
в UIUserInterfaceStyleLight
или же UIUserInterfaceStyleDark
на любом контроллере представления или представлении, которое будет использоваться в traitCollection
для любого подпредставления или просмотра контроллера.
Как уже упоминалось SeanR, вы можете установить UIUserInterfaceStyle
в Light
или же Dark
в файле plist вашего приложения, чтобы изменить это для всего вашего приложения.
Если вы не используете Xcode 11 или новее (i,e iOS 13 или новее SDK), ваше приложение не выбрало автоматически поддержку темного режима. Таким образом, нет необходимости отказываться от темного режима.
Если вы используете Xcode 11 или новее, система автоматически включила темный режим для вашего приложения. Есть два подхода к отключению темного режима в зависимости от ваших предпочтений. Вы можете отключить его полностью или отключить для любого конкретного окна, представления или контроллера представления.
Полностью отключить темный режим для вашего приложения
Вы можете отключить темный режим, включив UIUserInterfaceStyle
ключ со значением как Light
в файле Info.plist вашего приложения.
Это игнорирует предпочтения пользователя и всегда делает ваше приложение более светлым.
Отключить темный режим для Window, View или View Controller
Вы можете заставить свой интерфейс всегда отображаться в светлом или темном стиле, установив 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
Примечание. Apple настоятельно рекомендует поддерживать темный режим в вашем приложении. Таким образом, вы можете временно отключить темный режим.
Подробнее здесь: Выбор конкретного стиля интерфейса для вашего приложения iOS
Обновление Xcode 12 и iOS 14. Я попробовал предыдущие варианты отключения темного режима, и это предложение в файле info.plist у меня не работает:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
Теперь он переименован в:
<key>Appearance</key>
<string>Light</string>
Этот параметр заблокирует все темные режимы в полном приложении.
ИЗМЕНЕНО:
Исправлена опечатка, спасибо @sarah
********** Самый простой способ для Xcode 11 и выше ***********
Добавьте это в info.plist перед </dict></plist>
<key>UIUserInterfaceStyle</key>
<string>Light</string>
Я думаю, что нашел решение. Сначала я собрал его воедино из UIUserInterfaceStyle - список свойств информации и UIUserInterfaceStyle - UIKit, но теперь обнаружил, что это действительно задокументировано в разделе " Выбор определенного стиля интерфейса для вашего приложения iOS".
В вашейinfo.plist
, установленUIUserInterfaceStyle
(Стиль интерфейса пользователя) до1(UIUserInterfaceStyle.light
).
РЕДАКТИРОВАТЬ: Согласно ответу Дорбитл, более подходящим параметром для UIUserInterfaceStyle
может быть Light
,
- Для всего приложения (окна):
window!.overrideUserInterfaceStyle = .light
Вы можете получить окно из SceneDelegate
- Для одного ViewController:
viewController.overrideUserInterfaceStyle = .light
Вы можете установить любой viewController
Даже внутри ViewController онсам
- Для одного просмотра:
view.overrideUserInterfaceStyle = .light
Вы можете установить любой view
, Даже внутри его просмотрая
Возможно, вам придется использовать if #available(iOS 13.0, *) { ,,, }
если вы поддерживаете более ранние версии iOS.
Ответ выше работает, если вы хотите отказаться от всего приложения. Если вы работаете с библиотекой с пользовательским интерфейсом, и у вас нет возможности редактировать.plist, вы также можете сделать это через код.
Если вы компилируете iOS 13 SDK, вы можете просто использовать следующий код:
Swift:
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"];
}
}
Swift 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
}
}
Вы можете отключить темный режим во всем приложении в Xcode 11:
- Перейти в Info.plist
Добавить ниже как
<key>UIUserInterfaceStyle</key> <string>Light</string>
Info.plist будет выглядеть так, как показано ниже...
Последнее обновление-
Если вы используете Xcode 10.x, то по умолчанию UIUserInterfaceStyle
является light
для iOS 13.x. При запуске на устройстве iOS 13 он будет работать только в облегченном режиме.
Нет необходимости явно добавлять UIUserInterfaceStyle
в файле Info.plist, добавив его, вы получите сообщение об ошибке при проверке приложения:
Неверный ключ Info.plist. Ключ UIUserInterfaceStyle в файле Payload/AppName.appInfo.plist недействителен.
Только добавьте UIUserInterfaceStyle
ключ в файле Info.plist при использовании Xcode 11.x.
Обновление iOS 14.3 и Xcode 12.3
В файле info.plist добавьте Appearance как Light .
<key>Appearance</key>
<string>Light</string>
Если вы добавите UIUserInterfaceStyle
ключ к файлу plist, возможно, Apple отклонит сборку релиза, как упомянуто здесь: /questions/49910878/nonei-os-13-otklyuchit-izmeneniya-dark-mode/49910889#49910889 любом случае раздражает явное указание каждому 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
на этой ранней стадии. Но вы можете сделать это позже. Это очень легко, если вы используете пользовательские AppPresenter
или же AppRouter
класс в вашем приложении вместо автоматического запуска пользовательского интерфейса в AppDelegate.
На данный момент мое приложение не поддерживает темный режим и использует светлый цвет панели приложений. Мне удалось заставить содержимое строки состояния отображать темный текст и значки, добавив следующий ключ к моему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
Пользователи Flutter
Не забудьте установить атрибут яркости панели приложения на панели приложения Flutter следующим образом:
AppBar(
backgroundColor: Colors.grey[100],
brightness: Brightness.light, // <---------
title: const Text('Hi there'),
),
Помимо других ответов, насколько я понимаю, вам нужно подготовиться только к темному режиму при компиляции с iOS 13 SDK (с использованием XCode 11).
Система предполагает, что приложения, связанные с iOS 13 или более поздней версией SDK, поддерживают как светлый, так и темный вид. В iOS вы указываете конкретный внешний вид, который хотите, назначая определенный стиль интерфейса вашему окну, представлению или контроллеру представления. Вы также можете полностью отключить поддержку темного режима с помощью ключа Info.plist.
Добавьте это в
info.plist
<key>UIUserInterfaceStyle</key>
<string>Light</string>
Да .. вы можете добавить настройку ниже в проект iOS.
В файле info.plist добавьте UIUserInterfaceStyle в Light.
Если ваш проект находится в IONIC .. Вы можете добавить настройки ниже в файл конфигурации
<platform name="ios">
<edit-config file="*-Info.plist" mode="merge" target="UIUserInterfaceStyle">
<string>Light</string>
</edit-config>
</platform>
Используя эти настройки, темный режим устройства не повлияет на ваше приложение.
Objective-c версия
if (@available(iOS 13.0, *)) {
_window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
Да, вы можете пропустить, добавив следующий код в viewDidLoad:
if #available(iOS 13.0, *) {
// Always adopt a light interface style.
overrideUserInterfaceStyle = .light
}
Вот несколько советов и приемов, которые вы можете использовать в своем приложении для поддержки или обхода темного режима.
Первый совет: переопределить стиль ViewController
вы можете переопределить стиль интерфейса UIViewController с помощью
1: overrideUserInterfaceStyle = .dark // Для темного режима
2: overrideUserInterfaceStyle = .light // Для светового режима
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
overrideUserInterfaceStyle = .light
}
}
Второй совет: добавление ключа в info.plist
Просто вы можете добавить новый ключ
UIUserInterfaceStyle
в вашем приложении info.plist и установите для него значение Светлый или Темный. это заменит стиль приложения по умолчанию на указанное вами значение. Вам не нужно добавлять overrideUserInterfaceStyle =.light эту строку в каждый viewController, только одна строка в info.plist, вот и все.
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .light
} else {
// Fallback on earlier versions
}
Я бы использовал это решение, поскольку свойство окна может быть изменено в течение жизненного цикла приложения. Поэтому необходимо повторить присвоение 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
}
}
Просто добавьте следующий ключ в свой info.plist
файл:
<key>UIUserInterfaceStyle</key>
<string>Light</string>
Просто добавьте эту строку в файл info.plist:
<key>UIUserInterfaceStyle</key>
<string>light</string>
Это заставит приложение работать только в облегченном режиме.
добавлять
overrideUserInterfaceStyle = .light
в файле ViewController.swift или измените внешний вид на "светлый" в файле info.plist
Вы можете сделать: добавить этот новый ключ UIUserInterfaceStyle в Info.plist и установить для него значение Light. и проверьте, что контроллер предупреждений появляется в световом режиме.
UIUserInterfaceStyleLight Если вы включили светлый / темный режим во всем приложении независимо от настроек пользователя, добавив ключ UIUserInterfaceStyle в ваш файл Info.plist и установив для него значение Light или Dark.
import UIKit
extension UIViewController {
override open func awakeFromNib() {
super.awakeFromNib()
if #available(iOS 13.0, *) {
overrideUserInterfaceStyle = .light
}
}
}
На этот вопрос так много ответов, поэтому лучше использовать его в info.plist
вы можете установить это в AppDelegate
нравится:
#if compiler(>=5.1)
if #available(iOS 13.0, *) {
self.window?.overrideUserInterfaceStyle = .light
}
#endif
Тест на Xcode 11.3, iOS 13.3