iOS 13: NavigationBar BarStyle игнорируется при использовании UINavigationBarAppearance - PullRequest
2 голосов
/ 20 октября 2019

У меня есть пользовательская цветная панель навигации, и я должен убедиться, что цвет строки состояния установлен на белый. В предыдущей iOS 13 это было легко сделать, вот фрагмент кода из UIViewController, который отлично справился со своей задачей:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.barStyle = .black
}

Проблема, с которой я сталкиваюсь в iOS 13, заключается в том, что мне теперь нужно использоватьстандартные элементы NavigationBar и scrollEdgeAppearance для отмены принудительной прозрачности фона в новом UIKit. В то время как я могу получить текст и цвет фона NavigationBar до того, что мне нужно, с помощью UINavigationBarAppearance (), он возвращает свой цвет строки состояния на черный. Вот простой пример, который воспроизводит проблему:

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.standardAppearance = UINavigationBarAppearance() // <--- This is the line that reverts my status bar colour back to black
    self.navigationController?.navigationBar.barStyle = .black
}

Я не уверен, что я делаю что-то не так или это ошибка UIKit?

EDIT

Наконец-то удалось решить проблему, добавив два следующих свойства в мой файл Info.plist:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

Info.plist properties

Ответы [ 4 ]

1 голос
/ 24 октября 2019

Изменения для темного режима включают новое свойство UIView и UIViewController с именем overrideUserInterfaceStyle. Это предпочтительный способ указать, что вам нужен определенный светлый / темный стиль вместо поведения по умолчанию, когда мы реагируем на текущее состояние темного режима.

Если вы установите это на панели навигации или контроллере навигации, тогдаВы должны получить ожидаемое поведение (при условии, что вы хотите везде свет или тьму). Если вам нужно больше контроля, то может иметь больше смысла для подкласса UINavigationController изменить его поведение (переопределив -childViewControllerForStatusBarStyle и вернув контроллер верхнего вида, например).

0 голосов
/ 20 октября 2019

Мне удалось наконец установить стиль строки состояния на белый для всего приложения. Существует множество решений для SO, но по моему опыту некоторые из них могут быть очень специфичными для iOS, то есть то, что работает для кого-то на iOS 8-12, не обязательно означает, что оно будет работать на iOS 13 с XCode 11 .

Вот мое решение, которое работает на iOS 13 с XCode 11 (также протестировано на устройствах под управлением iOS 12 для обратной совместимости) и UINavigationBar.appearance (). standardAppearance = UINavigationBarAppearance () . В файле Info.plist добавьте следующие два свойства:

Info.plist properties

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>
0 голосов
/ 23 октября 2019

Есть ли решение этой проблемы без установки UIViewControllerBasedStatusBarAppearance в false? Я хочу изменить цвет строки состояния для каждого контроллера представления.

0 голосов
/ 20 октября 2019

Я выучил это нелегко, но,

"Недостаточно просто создать экземпляр UINavigationBarAppearance." Вы должны фактически установить его для экземпляра UINavigationBar.

Это на самом деле не выражено мной, я нашел это в потоке в стеке над потоком, я искал его, но не смог найти его для васОднако в контексте то, что должно вам помочь, приведено ниже.

 //Using this we have to first set up the appearance.

 UINavigationBarAppearance *appearance = [UINavigationBarAppearance new];
 appearance.titleTextAttributes = @{NSFontAttributeName: font};

 //Then u have to use it on the navigation bar and if needed on scroll Edge 

  yourNavigationBar.standardAppearance = appearance;
  yourNavigationBar.scrollEdgeAppearance = appearance; 

 if you want this globally in your navigation bars 

 UINavigationBar.appearance.standardAppearance = appearance;

Еще один «хак» - добавить это в Appdelegate, которое будет работать для всех панелей навигации в вашем приложении.

in Appdelgate

func configureGlobalUI() {

UINavigationBar.appearance().barTintColor = .red
}

Позвоните на didFinishLaunching

...