Можно ли отказаться от темного режима на 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 своих приложений.
UIUserInterfaceStyle as Light
Это игнорирует пользовательские настройки и всегда применяет легкий вид к вашему приложению.

Отключить темный режим для окна, вида или контроллера вида

Вы можете заставить свой интерфейс всегда отображаться в светлом или темном стиле, установив свойство 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