Внешний вид строки состояния не работает должным образом - с темным режимом iOS 13

В моем приложении используется стиль панели defaultstatus для экранов перед входом в систему. - После входа в систему приложение использует стиль lightContent для строки состояния во всем приложении.

Все работало нормально до iOS 12. Это начало создавать проблемы с iOS 13 (только когда включен темный режим).

Вот вещи, которые я уже пробовал, но все еще не работает нормально.

  • Я установил UIUserInterfaceStyle на Light
  • Я установил UIViewControllerBasedStatusBarAppearance на YES
  • Затем я попробовал код ниже в отдельном контроллере представления

override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }

  • Также добавил эту строку в viewDidLoad() файла класса.

setNeedsStatusBarAppearanceUpdate()

Но все же я не избавляюсь от этой вещи, связанной со строкой состояния. Мне просто нужно, чтобы моя строка состояния была темной на экранах перед входом в систему, и как только пользователь вошел в систему, она должна светиться.

Все приложение должно иметь одинаковый интерфейс для темного и светлого режимов. (как и для ОС ниже iOS 13), которая сейчас работает нормально, но меняет цвет только строка состояния.

Примечание: все работает нормально, когда темный режим отключен. Это создает проблемы только при включенном темном режиме.

Насколько я понимаю, я создал новый проект в Xcode и добавил 3 экрана с разным внешним видом строки состояния.

Рабочий корпус
VC1 - Default Style
VC2 - Default Style
VC3 - LightContent Style

Рабочий корпус
VC1 - LightContent Стиль
VC2 - LightContent Стиль
VC3 - Default Стиль

Случай неработоспособности (сбоя)
VC1 - Default Style
VC2 - LightContent Style
VC3 - Default Style

Я предполагаю, что если вы используете любой из стилей в своем приложении, он отлично работает независимо от темного или светлого режима устройства. Но если вы объедините Default и LightContent для отображения строки состояния в вашем приложении, тогда оно не будет работать должным образом, пока включен темный режим.

Может ли кто-нибудь помочь мне с этим поведением стиля строки состояния?

Вот три моих файла контроллера представления. Он просто подталкивает один контроллер к другому. Это файлы для демонстрационного проекта, о котором я упоминал выше. Который имеет случай отказа. просмотреть контроллеры

Когда темный режим выключен: я всегда получаю default стиль строки состояния, даже если переопределяю стиль строки состояния в VC2.
Когда темный режим выключен: я всегда получаю lightContent стиль строки состояния, даже когда я переопределяю стиль строки состояния в VC1 и VC3.

Вот мой файл info.plist  Файл Info.plist моего демонстрационного проекта


person Akash Patel    schedule 25.11.2019    source источник


Ответы (4)


В вашем случае контроллер навигации отвечает за поддержание стиля строки состояния. Следовательно, вам нужно создать подкласс своего контроллера навигации и переопределить его предпочтительныйStatusBarStyle.

person Hamidreza Vakilian    schedule 12.06.2020

Если вы не хотите поддерживать темный режим в своем приложении (и кажется, что вам нужны фиксированные светлые и цветовые схемы по умолчанию), вы можете полностью отказаться от него в своем Info.plist, установив UIUserInterfaceStyle на светлый или темный или на каждый отдельный контроллер просмотра вы можете override var overrideUserInterfaceStyle: UIUserInterfaceStyle { get { .light } set { //you can leave this empty } }

Редактировать:

Чтобы изменить только внешний вид строки состояния без каких-либо действий с darkMode, вы отказываетесь от темного режима в Info.plist, затем добавляете UIUserInterfaceStyle со значением YES, и в каждом viewController вам нужен другой стиль строки состояния, вам необходимо переопределить предпочтительное свойство внешнего вида строки состояния следующим образом:

 override var preferredStatusBarStyle: UIStatusBarStyle {
        .lightContent
    }
} 

и, наконец, вы вызываете setNeedsStatusBarAppearanceUpdate() в viewDidLoad ()

Edit2:

если внутри контроллера навигации вам нужно установить вышеупомянутое внутри пользовательского класса контроллера навигации следующим образом:

import UIKit

class Navi: UINavigationController {

    public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
            requiredStatusBarStyle
    }

}

затем в каждом VC вы можете установить в viewDidAppear свойство:

 if let navi = navigationController as? Navi {
            navi.requiredStatusBarStyle = .darkContent
        }

если вы не хотите резкого перехода между светлым и темным, вы можете обернуть анимацию uiview вокруг setneedsstatusbarupdate

public var requiredStatusBarStyle: UIStatusBarStyle = .lightContent {
        didSet {
            UIView.animate(withDuration: 0.5) {
                self.setNeedsStatusBarAppearanceUpdate()
            }
        }
    }
person Andras M.    schedule 25.11.2019
comment
Спасибо за ваш ответ. Ваше решение меняет весь мой контроллер представления в темной теме. Мне просто нужно изменить цвет строки состояния, а не другие цвета элементов пользовательского интерфейса. Приложение должно быть одинаковым для темного и светлого обоих режимов, - person Akash Patel; 25.11.2019
comment
затем, как я уже упоминал, откажитесь от темного режима, изменив свойство Info.plist на светлый, а затем добавьте UIViewControllerBasedStatusBarAppearance со значением YES. В ваших контроллерах просмотра вы можете переопределить переменную предпочитаемогоStatusbarAppearance таким образом override var preferredStatusBarStyle: UIStatusBarStyle { .lightContent } и не забудьте вызвать setNeedsStatusBarAppearanceUpdate() в viewDidLoad - person Andras M.; 26.11.2019
comment
Спасибо за усилия, которые вы прилагаете для решения этой проблемы. Я обновил свой вопрос и добавил скриншоты моих файлов ViewController и Info.plist. Я делаю именно то, что вы предлагаете. Но это не работает. - person Akash Patel; 26.11.2019
comment
Ваш код не показывает отношения между контроллерами, т.е. как они представлены? Если у вас есть раскадровка с контроллером навигации, вам необходимо создать новый класс, унаследованный от UINavigationController, и переопределить указанное выше свойство в нем, а также вызвать setNeedsStatusBarAppearanceUpdate(). Вы можете добавить общедоступную функцию, чтобы установить любой вид, который вам нужен, и вызвать ее из нажатого VC1 / 2/3 с желаемым стилем темный / светлый в качестве параметра. - person Andras M.; 27.11.2019

Пожалуйста, попробуйте один раз использовать это

controller.navigationController?.navigationBar.isTranslucent = false

потому что в моем случае это сработало.

person Brijesh Rashiya    schedule 25.11.2019
comment
Спасибо за ваш ответ. Я попробовал ваше решение. Но все же я не получаю default стиль строки состояния, когда включен темный режим. Он всегда отображает lightContent строку состояния. Я даже добавил User Interface Style ключ в файл info.plist со значением Light. По-прежнему не повезло! - person Akash Patel; 25.11.2019
comment
строка состояния - это место, где у вас батарея, часы оператора связи и т. д., а не панель навигации. - person Andras M.; 26.11.2019

Вы можете установить стиль строки состояния по умолчанию в общих настройках вашего проекта.

person Gowri G    schedule 26.11.2019
comment
Я установил стиль по умолчанию. Но я хочу использовать разные стили для разных экранов во всем приложении. Думаю, это не поможет. - person Akash Patel; 26.11.2019