Можно ли отказаться от темного режима на iOS 13?
Большая часть моего приложения состоит из веб-представлений для обеспечения функциональности, которая еще не доступна в собственных реализациях. У веб-команды нет планов по реализации темной темы для сайта. Таким образом, мое приложение будет выглядеть наполовину с поддержкой Dark Mode на iOS 13.
Можно ли отказаться от поддержки Dark Mode, чтобы наше приложение всегда отображало светлый режим в соответствии с темой сайта?
Ответы
Ответ 1
В соответствии с сессией Apple "Внедрение темного режима на iOS" (https://developer.apple.com/videos/play/wwdc2019/214/ начиная с 31:13) можно установить для overrideUserInterfaceStyle
значение UIUserInterfaceStyleLight
или UIUserInterfaceStyleDark
на любом контроллере представления или представлении, которое будет использоваться в traitCollection
для любого контроллера подпредставления или просмотра.
Как уже упоминалось SeanR, вы можете установить UIUserInterfaceStyle
на Light
или Dark
в файле plist вашего приложения, чтобы изменить это для всего вашего приложения.
Ответ 2
Если вы не используете Xcode 11 или новее (например, iOS 13 или новее SDK), ваше приложение автоматически не поддерживает темный режим. Таким образом, нет необходимости отказываться от темного режима.
Если вы используете Xcode 11 или новее, система автоматически включила темный режим для вашего приложения. Есть два подхода для отключения темного режима в зависимости от ваших предпочтений. Вы можете отключить его полностью или отключить для любого конкретного окна, вида или контроллера просмотра.
Отключить темный режим полностью для вашего приложения
Вы можете отключить темный режим, включив клавишу UIUserInterfaceStyle
со значением Light
в файл Info.plist своих приложений.
Это игнорирует пользовательские настройки и всегда применяет легкий вид к вашему приложению.
Отключить темный режим для окна, вида или контроллера вида
Вы можете заставить свой интерфейс всегда отображаться в светлом или темном стиле, установив свойство overrideUserInterfaceStyle
соответствующего окна, вида или контроллера вида.
Просмотр контроллеров:
override func viewDidLoad() {
super.viewDidLoad()
/* view controllers 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
Ответ 3
Я думаю, что нашел решение. Первоначально я собрал его воедино из UIUserInterfaceStyle - информационного списка свойств и UIUserInterfaceStyle - UIKit, но теперь нашел, что это действительно задокументировано в Выбор определенного стиля интерфейса для вашего приложения iOS.
В info.plist
установите для UIUserInterfaceStyle
(стиль интерфейса пользователя) значение 1 (UIUserInterfaceStyle.light
).
ОБНОВЛЕНИЕ: Согласно ответу dorbeetle, более подходящей настройкой для UIUserInterfaceStyle
может быть Light
.
Ответ 4
Ответ выше работает, если вы хотите отказаться от всего приложения. Если вы работаете с библиотекой, в которой есть пользовательский интерфейс, и у вас нет возможности редактировать .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"];
}
}
Ответ 5
Если вы добавите ключ UIUserInterfaceStyle
в файл plist, возможно, Apple отклонит сборку релиза, как указано здесь: fooobar.com/questions/17782729/...
В любом случае, раздражает явное указание каждого 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.
Ответ 6
Последний Update-
Если вы используете Xcode 10, то по умолчанию UIUserInterfaceStyle
является light
для iOS 13. При запуске на устройстве iOS 13 оно будет работать только в легком режиме.
Нет необходимости явно добавлять ключ UIUserInterfaceStyle
в файл Info.plist, добавление которого приведет к ошибке при проверке приложения: "
Неверный ключ Info.plist. Недопустимый ключ UIUserInterfaceStyle в файле Payload/AppName.appInfo.plist.
Добавляйте ключ UIUserInterfaceStyle
в файл Info.plist только при использовании Xcode 11.
Ответ 7
********** Самый простой способ ***********
Добавьте это в info.plist
<key>UIUserInterfaceStyle</key>
<string>Light</string>
Ответ 8
- Для всего приложения (окно):
window!.overrideUserInterfaceStyle = .light
Вы можете получить окно из SceneDelegate
- Для одного ViewController:
viewController.overrideUserInterfaceStyle = .light
Вы можете установить любой viewController
, даже внутри viewController, он сам
- Для одного просмотра:
view.overrideUserInterfaceStyle = .light
Вы можете установить любой view
, даже внутри самого просмотра.self
Возможно, вам придется использовать if #available(iOS 13.0, *) { ,,, }
, если вы поддерживаете более ранние версии iOS.
Ответ 9
Помимо других ответов, исходя из моего понимания следующего, вам нужно только подготовиться к режиму Dark при компиляции с iOS 13 SDK.
Система предполагает, что приложения связаны с iOS 13 или более поздним SDK поддерживать светлые и темные появления. В iOS вы указываете определенный внешний вид, который вы хотите, назначив определенный стиль интерфейса в ваше окно, просмотр или просмотр контроллера. Вы также можете отключить поддержку для темного режима полностью с помощью ключа Info.plist.
Ссылка
Ответ 10
Да, вы можете пропустить, добавив следующий код в viewDidLoad:
if #available(iOS 13.0, *) {
// Always adopt a light interface style.
overrideUserInterfaceStyle = .light
}
Ответ 11
Мое приложение не поддерживает темный режим на данный момент и использует светлый цвет панели приложения. Мне удалось заставить содержимое строки состояния отображать темный текст и значки, добавив следующий ключ в Info.plist
:
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleDarkContent</string>
Найдите другие возможные значения здесь: https://developer.apple.com/documentation/uikit/uistatusbarstyle