Большая часть моего приложения состоит из веб-представлений, обеспечивающих функциональность, пока недоступную в собственных реализациях. У веб-команды нет планов по реализации темной темы для сайта. Таким образом, мое приложение будет выглядеть наполовину с поддержкой Dark Mode на iOS 13.
Можно ли отказаться от поддержки Dark Mode, чтобы наше приложение всегда отображало светлый режим в соответствии с темой сайта?
ios
ios13
ios-darkmode
SeanR
источник
источник
UIUserInterfaceStyle
дляLight
вашей info.plist. См developer.apple.com/library/archive/documentation/General/...Ответы:
Во-первых, вот запись Apple, связанная с отказом от темного режима. Содержание по этой ссылке написано для Xcode 11 и iOS 13 :
Этот раздел относится к использованию Xcode 11
Подход № 1
Используйте следующий ключ в вашем файле info.plist :
И присвойте ему значение
Light
.XML для
UIUserInterfaceStyle
задания:Подход № 2
Вы можете установить
overrideUserInterfaceStyle
противwindow
переменной приложения .В зависимости от того, как был создан ваш проект, это может быть в
AppDelegate
файле илиSceneDelegate
.Документация Apple для overrideUserInterfaceStyle
Как приведенный выше код будет выглядеть в Xcode 11:
Этот раздел относится к использованию Xcode 10.x.
Если вы используете Xcode 11 для представления, вы можете спокойно игнорировать все, что находится ниже этой строки.
Поскольку соответствующий API не существует в iOS 12, вы будете получать ошибки при попытке использовать значения, указанные выше:
Для настройки
overrideUserInterfaceStyle
в вашемUIViewController
Это может быть обработано в Xcode 10, проверяя версию компилятора и версию iOS:
Вы можете изменить вышеупомянутый фрагмент, чтобы работать против всего приложения для Xcode 10, добавив следующий код в свой
AppDelegate
файл.Однако настройка plist не удастся при использовании Xcode версии 10.x:
Кредит @Aron Нельсон , @Raimundas Сакалаускасом , @NSLeader и rmaddy для улучшения этого ответа с их обратной связи.
источник
overrideUserInterfaceStyle
вviewDidLoad
каждой контроллере представления, вы можете установить его один раз в главном окне приложения. Намного проще, если вы хотите, чтобы все приложение работало в одном направлении.#if compiler(>=5.1)
вместо этогоresponds(to:)
иsetValue
Согласно сессии Apple, на «Dark Mode исполнителя на прошивке» ( https://developer.apple.com/videos/play/wwdc2019/214/ начиная с 31:13) , то можно установить
overrideUserInterfaceStyle
вUIUserInterfaceStyleLight
илиUIUserInterfaceStyleDark
на любом контроллере представления или представление , который будет использоваться вtraitCollection
любом контроллере подпредставления или представления.Как уже упомянуто SeanR, вы можете установить
UIUserInterfaceStyle
наLight
илиDark
в Plist файла вашего приложения , чтобы изменить это для всего приложения.источник
Если вы не используете Xcode 11 или новее (например, iOS 13 или новее SDK), ваше приложение автоматически не поддерживает темный режим. Таким образом, нет необходимости отказываться от темного режима.
Если вы используете Xcode 11 или новее, система автоматически включила темный режим для вашего приложения. Есть два подхода для отключения темного режима в зависимости от ваших предпочтений. Вы можете отключить его полностью или отключить для любого конкретного окна, вида или контроллера просмотра.
Отключить темный режим полностью для вашего приложения
Вы можете отключить темный режим, включив
UIUserInterfaceStyle
ключ со значением, какLight
в файле Info.plist вашего приложения.Это игнорирует предпочтения пользователя и всегда придает легкий вид вашему приложению.
Отключить темный режим для Window, View или View Controller
Вы можете заставить свой интерфейс всегда отображаться в светлом или темном стиле, установив
overrideUserInterfaceStyle
свойство соответствующего окна, вида или контроллера вида.Посмотреть контроллеры:
Просмотры:
Окно:
Подробнее читайте здесь: Выбор определенного стиля интерфейса для вашего приложения для iOS
источник
********** Самый простой способ для Xcode 11 и выше ***********
Добавьте это в info.plist перед
</dict></plist>
источник
Я думаю, что нашел решение. Сначала я собрал его воедино из UIUserInterfaceStyle - список свойств информации и UIUserInterfaceStyle - UIKit , но теперь обнаружил, что это действительно задокументировано в разделе « Выбор определенного стиля интерфейса для приложения iOS» .
В вашем случае
info.plist
установитеUIUserInterfaceStyle
( Стиль интерфейса пользователя ) на 1 (UIUserInterfaceStyle.light
).РЕДАКТИРОВАТЬ: Согласно ответу Дорбитл, более подходящим параметром для
UIUserInterfaceStyle
может бытьLight
.источник
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
Ответ выше работает, если вы хотите отказаться от всего приложения. Если вы работаете с библиотекой, в которой есть пользовательский интерфейс, и у вас нет возможности редактировать .plist, вы можете сделать это и с помощью кода.
Если вы компилируете с iOS 13 SDK, вы можете просто использовать следующий код:
Swift:
Obj-C:
ОДНАКО , если вы хотите, чтобы ваш код компилировался с iOS 12 SDK (который сейчас все еще является последним стабильным SDK), вам следует прибегнуть к использованию селекторов. Код с селекторами:
Swift (XCode покажет предупреждения для этого кода, но пока это единственный способ сделать это, так как свойство не существует в SDK 12, поэтому не будет компилироваться):
Obj-C:
источник
overrideUserInterfaceStyle
относится.Последнее обновление-
Если вы используете Xcode 10.x, то по умолчанию
UIUserInterfaceStyle
используетсяlight
iOS 13.x. При запуске на устройстве iOS 13 оно будет работать только в легком режиме.Нет необходимости явно добавлять
UIUserInterfaceStyle
ключ в файл Info.plist, добавление которого приведет к ошибке при проверке приложения:Добавить только
UIUserInterfaceStyle
ключ в файле Info.plist при использовании Xcode 11.x.источник
Если вы добавите
UIUserInterfaceStyle
ключ в файл plist, возможно, Apple откажется от сборки выпуска, как упомянуто здесь: https://stackoverflow.com/a/56546554/7524146 В любом случае, раздражает явное уведомление каждого ViewControllerself.overrideUserInterfaceStyle = .light
. Но вы можете использовать этот мир кода один раз для корневогоwindow
объекта:Просто обратите внимание, что вы не можете сделать это внутри,
application(application: didFinishLaunchingWithOptions:)
потому что этот селектор не будет отвечатьtrue
на этом раннем этапе. Но вы можете сделать это позже. Это очень просто, если вы используете пользовательскийAppPresenter
илиAppRouter
класс в своем приложении вместо автоматического запуска пользовательского интерфейса в AppDelegate.источник
Вы можете включить Dark Mode во всем приложении в Xcode 11:
Добавить ниже как
Info.plist будет выглядеть ниже ...
источник
- Для всего приложения (окна):
Вы можете получить окно от
SceneDelegate
- Для одного ViewController:
Вы можете установить любой
viewController
, даже внутри viewController это сам- Для одного просмотра:
Вы можете установить любой
view
, даже внутри просмотра себяВозможно, вам придется использовать,
if #available(iOS 13.0, *) { ,,, }
если вы поддерживаете более ранние версии iOS.источник
Помимо других ответов, исходя из моего понимания следующего, вам нужно только подготовиться к режиму Dark при компиляции с iOS 13 SDK (с использованием XCode 11).
Ссылка на сайт
источник
Да, вы можете пропустить, добавив следующий код в viewDidLoad:
источник
Мое приложение не поддерживает темный режим на данный момент и использует светлый цвет панели приложения. Мне удалось заставить содержимое строки состояния отображать темный текст и значки, добавив следующий ключ к моему
Info.plist
:Найдите другие возможные значения здесь: https://developer.apple.com/documentation/uikit/uistatusbarstyle
источник
Версия Objective-c
источник
Вот несколько советов и приемов, которые вы можете использовать в своем приложении для поддержки или обхода темного режима.
Первый совет: переопределить стиль ViewController
Вы можете переопределить стиль интерфейса UIViewController с помощью
Второй совет: добавление ключа в info.plist
Просто вы можете добавить новый ключ
в вашем приложении info.plist и установите для него значение Light или Dark. это заменит стиль приложения по умолчанию на указанное вами значение. Вам не нужно добавлять overrideUserInterfaceStyle = .light эту строку в каждый viewController, только одна строка в info.plist.
источник
Просто добавьте следующий ключ в ваш
info.plist
файл:источник
источник
Swift 5
Два способа переключить темный в светлый режим:
источник
Я бы использовал это решение, так как свойство окна может быть изменено в течение жизненного цикла приложения. Поэтому присвоение overrideUserInterfaceStyle = .light необходимо повторить. UIWindow.appearance () позволяет нам установить значение по умолчанию, которое будет использоваться для вновь созданных объектов UIWindow.
источник
Просто добавьте эти строки в файл info.plist:
Это заставит приложение работать только в легком режиме.
источник
источник
Вы можете сделать: добавить этот новый ключ UIUserInterfaceStyle в Info.plist и установить его значение Light. и проверьте, появляется ли контроллер оповещений в режиме освещения.
UIUserInterfaceStyle Light Если вы используете режим «свет / темнота» во всем приложении независимо от настроек пользователя, добавив ключ UIUserInterfaceStyle в файл Info.plist и установив для него значение Light или Dark.
источник
На этот вопрос так много ответов, что, используя его,
info.plist
вы можете установить егоAppDelegate
следующим образом:Тест на Xcode 11.3, iOS 13.3
источник
На самом деле я только что написал некоторый код, который позволит вам глобально отказаться от темного режима в коде, не прибегая к использованию каждого отдельного контроллера viw в вашем приложении. Это, вероятно, может быть улучшено, чтобы отказаться от класса за классом, управляя списком классов. Я хочу, чтобы мои пользователи увидели, нравится ли им интерфейс темного режима для моего приложения, и если им это не нравится, они могут отключить его. Это позволит им продолжать использовать темный режим для остальных приложений.
Выбор пользователя хороший (Гм, глядя на тебя, Apple, вот как ты должен был это реализовать).
Итак, как это работает, так это то, что это просто категория UIViewController. Когда он загружается, он заменяет собственный метод viewDidLoad на тот, который будет проверять глобальный флаг, чтобы увидеть, отключен ли темный режим для всех или нет.
Поскольку он запускается при загрузке UIViewController, он должен автоматически запуститься и отключить темный режим по умолчанию. Если это не то, что вам нужно, тогда вам нужно рано или поздно войти туда и установить флаг, или просто установить флаг по умолчанию.
Я еще ничего не написал, чтобы пользователь мог включить или выключить флаг. Так что это в основном пример кода. Если мы хотим, чтобы пользователь взаимодействовал с этим, все контроллеры представления должны будут перезагрузиться. Я не знаю, как сделать это от руки, но, вероятно, отправка какого-то уведомления поможет. Так что сейчас это глобальное включение / выключение для темного режима будет работать только при запуске или перезапуске приложения.
Теперь недостаточно просто отключить темный режим в каждом отдельном контроллере MFING в вашем огромном приложении. Если вы используете цветовые активы, вы полностью очищены от костей. Мы более 10 лет понимаем, что неизменяемые объекты неизменны. Цвета, которые вы получаете из каталога цветовых активов, говорят, что это UIColor, но они являются динамическими (изменяемыми) цветами и будут меняться под вами при переходе системы из темного в светлый режим. Это должно быть особенность. Но, конечно, нет главного переключателя, который бы попросил эти вещи прекратить вносить эти изменения (насколько я знаю сейчас, возможно, кто-то может улучшить это).
Итак, решение состоит из двух частей:
публичная категория на UIViewController, которая предоставляет некоторые полезные и удобные методы ... например, я не думаю, что Apple думала о том, что некоторые из нас смешивают веб-код с нашими приложениями. Таким образом, у нас есть таблицы стилей, которые нужно переключать на основе темного или светлого режима. Таким образом, вам нужно либо создать какой-то динамический объект таблицы стилей (что было бы хорошо), либо просто спросить, каково текущее состояние (плохо, но легко).
эта категория при загрузке заменит метод viewDidLoad класса UIViewController и перехватывает вызовы. Я не знаю, нарушает ли это правила магазина приложений. Если это произойдет, возможно, есть и другие способы, но вы можете считать это доказательством концепции. Например, вы можете сделать один подкласс из всех основных типов контроллеров представления и сделать так, чтобы все ваши собственные контроллеры представления наследовали от них, а затем вы можете использовать идею категории DarkMode и вызвать ее, чтобы заставить отказаться от всех ваших контроллеров представления. Это уродливее, но не нарушает никаких правил. Я предпочитаю использовать среду выполнения, потому что именно для этого была создана среда выполнения. Так что в моей версии вы просто добавляете категорию, вы устанавливаете глобальную переменную для категории, хотите ли вы, чтобы она блокировала темный режим, и она это сделает.
Вы еще не вышли из леса, как уже упоминалось, другая проблема заключается в том, что UIColor делает все, что хочет. Так что даже если ваши контроллеры вида блокируют темный режим, UIColor не знает, где и как вы его используете, поэтому не может адаптироваться. В результате вы можете получить его правильно, но в будущем он вернется к вам. Возможно, скоро, может быть, позже. Так что обойти это можно, выделив его дважды с помощью CGColor и превратив его в статический цвет. Это означает, что если ваш пользователь вернется и снова включит темный режим на странице настроек (идея заключается в том, чтобы заставить эту работу работать таким образом, чтобы пользователь мог контролировать ваше приложение над остальной частью системы), все эти статические цвета нужна замена. Пока это остается решать кому-то другому. Самый простой способ сделать это - сделать по умолчанию Отказавшись от темного режима, разделите на ноль, чтобы вывести приложение из строя, поскольку вы не можете выйти из него, и попросите пользователя просто перезапустить его. Это, вероятно, нарушает правила магазина приложений, но это идея.
Категория UIColor не нуждается в показе, она просто работает, вызывая colorNamed: ... если вы не указали классу DarkMode ViewController блокировать темный режим, он будет работать прекрасно, как и ожидалось. Попытка сделать что-то элегантное вместо стандартного кода яблочного сфагетти, что будет означать, что вам придется изменить большую часть своего приложения, если вы хотите программно отказаться от темного режима или переключить его. Теперь я не знаю, есть ли лучший способ программно изменить Info.plist, чтобы отключить темный режим по мере необходимости. Насколько я понимаю, это особенность времени компиляции, и после этого вы костей.
Итак, вот код, который вам нужен. Должен быть вставлен и просто использовать один метод, чтобы установить стиль пользовательского интерфейса или установить по умолчанию в коде. Вы можете свободно использовать, изменять, делать с этим все, что вы хотите, для каких-либо целей, и никаких гарантий не дается, и я не знаю, пройдет ли это в магазине приложений. Улучшения очень приветствуются.
Справедливое предупреждение, я не использую ARC или любые другие методы хранения.
Существует набор служебных функций, которые используются для замены метода. Отдельный файл. Это стандартный материал, и вы можете найти подобный код в любом месте.
Я копирую и вставляю это из пары файлов, так как q-runtime.h - это моя многократно используемая библиотека, и это только ее часть. Если что-то не компилируется, дайте мне знать.
источник