В моем приложении iPhone построен с Xcode 5 для IOS 7 I множеств UIViewControllerBasedStatusBarAppearance=YES
в info.plist
, и в моем у ViewController
меня есть этот код:
-(UIStatusBarStyle) preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
Но строка состояния по-прежнему черная на черном фоне.
Я знаю , что его можно изменить это приложение шириной, установив UIViewControllerBasedStatusBarAppearance=NO
в info.plist
, но я на самом деле нужно , чтобы изменить это на viewController
на viewController
основе во время выполнения.
iphone
ios7
xcode5
uistatusbar
Эндрю Смит
источник
источник
Ответы:
Я обнаружил, что если ваш ViewController находится внутри navigationController, то navigationController
navigationBar.barStyle
определяет statusBarStyle.Установка вашего navigationBar в
barStyle
значениеUIBarStyleBlackTranslucent
даст белый текст строки состояния (т. Е.UIStatusBarStyleLightContent
) ИUIBarStyleDefault
даст черный текст строки состояния (т. Е.UIStatusBarStyleDefault
).Обратите внимание, что это применимо, даже если вы полностью измените цвет панели навигации с помощью ее
barTintColor
.источник
UINavigationController
'spreferredStatusBarStyle
не вызывает ViewController, который он размещает, а вместо этого просто возвращает на основе своего navigationBarStyle.UIBarStyleBlackTranslucent
устарело, используйтеUIBarStyleBlack
вместо этогоХорошо, вот трюк. Вам нужно добавить ключ «Просмотр строки состояния на основе контроллера» и установить значение Нет.
Это противоречит тому, что кажется значением этого ключа, но даже если вы установите значение
No
, вы все равно можете изменить внешний вид строки состояния, а также будет ли она отображаться в любом контроллере представления. Таким образом, он действует как «Да», но устанавливается на «Нет»!Теперь я могу сделать строку состояния белой или темной.
источник
Для
preferredStatusBarStyle()
работать вUINavigationController
иUITabBarController
добавить следующий код, который получит предпочтительный стиль строки состояния из текущего видимого контроллера представления.Для Swift 3 это не методы, а свойства:
В Swift 4.2 свойства были переименованы:
использование
источник
Возможно, я приду к этому немного поздно, но на случай, если кто-то еще ищет работающее и проверенное решение для всего приложения.
@mxcl правильно описывает, почему это происходит. Чтобы исправить это, мы просто создаем расширение (или категорию в obj-c), которое переопределяет метод primarySatusBarStyle () UINavigationController. Вот пример на Swift:
Этот код просто извлекает первый контроллер представления (корневой контроллер представления) и разворачивает его (в obj-c просто проверьте, не равен ли он нулю). Если разворачивание прошло успешно (не nil), мы получаем rootViewControllers preferredStatusBarStyle. В противном случае мы просто возвращаем значение по умолчанию.
Надеюсь, это поможет всем, кому это может понадобиться.
источник
return self.preferredStatusBarStyle()
обратится к этому же методу.visibleViewController
было бы еще лучшеЧтобы предоставить более подробную информацию о принятом ответе, поместите следующую строку в
didFinishLaunchingWithOptions:
метод делегата приложения :Затем в своем Info.plist добавьте
View controller-based status bar appearance
и установите для него значениеNO
.Я считаю, что это должно быть сделано, а НЕ с контроллера навигации, если вам нужен одинаковый цвет строки состояния для всего приложения. У вас могут быть экраны, которые не обязательно встроены в какой-
UINavigationController
либо другойUINavigationController
подкласс, где-то еще, и другие вещи.РЕДАКТИРОВАТЬ : вы также можете сделать это, не вводя никакого кода: qaru.site/questions/435 / ... / 18732865/855680
источник
В viewDidLoad просто напишите это
просто сделай это, и это сработает
можешь попробовать это
Еще одна вещь, которую я увидел в вашем вопросе, что вы написали такой метод
но это должно быть так
источник
[self setNeedsStatusBarAppearanceUpdate];
такой отличный метод, спасибо!Вот как я это решил. Обычно NavigationController или tabBarController определяют внешний вид строки состояния (скрытый, цветной и т. Д.).
В итоге я создал подкласс контроллера навигации и переопределил предпочтительныйStatusBarStyle. если текущий видимый ViewContorller реализует StatusBarStyleHandler, я прошу использовать значение в качестве стиля, если нет, я просто возвращаю значение по умолчанию.
Вы запускаете обновление внешнего вида строки состояния, вызывая,
setNeedsStatusBarAppearanceUpdate
который запускаетсяpreferredStatusBarStyle
снова и обновляет пользовательский интерфейс в соответствии с тем, что возвращает метод.Тогда использование
источник
1) Одна настройка для всего проекта:
Если возможно, удалите
UIViewControllerBasedStatusBarAppearance
пару ключ-значение из вашего info.plist или установите,NO
не удаляя ее. Если его нет в вашем info.plist, ничего не делайте. По умолчанию используетсяNO
это свойство.Добавьте код ниже в свой AppDelegate.m:
2) Различные настройки для разных контроллеров просмотра:
Добавьте
UIViewControllerBasedStatusBarAppearance
пару ключ-значение в свой info.plist и установите для нее значениеYES
.Если ваш View Controller не встроен в Navigation Controller. Скажем, MyViewController. просто добавьте приведенный ниже код в файл MyViewController.m. Если ваш контроллер представления встроен в контроллер навигации, создайте новый класс касания какао и сделайте его подклассом UINavigationController. Скажем MyNC. На правой панели выберите «Просмотр контроллера навигации» на раскадровке; Утилиты -> Инспектор идентичности -> Пользовательский класс -> Класс, введите «MyNC». После связывания раскадровки с вашим классом какао "MyNC" добавьте код ниже в свой MyNC.m:
источник
Даже со всеми ответами здесь я все еще не нашел для себя точного решения, но начал с ответа от Дэниела. В итоге я получил:
в контроллерах навигации (аналогично вкладке, только что selectedViewController). И тогда он будет уважать:
В каждом контроллере представления, если вы не установили иное. Мне не нужно
setNeedsStatusBarAppearanceUpdate()
никуда звонить , он просто обновляется, когда вы подходите к каждому контроллеру представления.источник
iOS 13 Решение (я)
В ответе с наибольшим количеством голосов используется "устаревший" код 👎
barStyle
Теперь установка свойства (iOS 13+) считается «устаревшей настройкой». Согласно Apple ,Что касается вашей попытки - вы были на правильном пути!
UINavigationController
является подклассомUIViewController
(кто знал 🙃)!Поэтому, представляя контроллеры представления, встроенные в контроллеры навигации, вы на самом деле не представляете встроенные контроллеры представления; вы представляете контроллеры навигации!
UINavigationController
, как подклассUIViewController
, наследуетpreferredStatusBarStyle
иchildForStatusBarStyle
, который вы можете установить по своему усмотрению.Любой из следующих методов должен работать:
Переопределить
preferredStatusBarStyle
вUINavigationController
preferredStatusBarStyle
( doc ) - предпочтительный стиль строки состояния для контроллера представленияПодкласс или расширить
UINavigationController
ИЛИ
Переопределить
childForStatusBarStyle
вUINavigationController
childForStatusBarStyle
( doc ) - вызывается, когда системе требуется контроллер представления для определения стиля строки состояния.Подкласс или расширить
UINavigationController
ИЛИ
Вы можете вернуть любой контроллер представления, который вам нужен выше. Я рекомендую одно из следующего:
topViewController
(ofUINavigationController
) ( doc ) - Контроллер представления в верхней части стека навигацииvisibleViewController
(изUINavigationController
) ( документ ) - Контроллер представления, связанный с текущим видимым представлением в интерфейсе навигации (подсказка: это может включать «контроллер представления, который был представлен модально поверх самого контроллера навигации»)Примечание. Если вы решили создать подкласс
UINavigationController
, не забудьте применить этот класс к своим навигационным контроллерам через инспектор идентичности в IB.PS В моем коде используется синтаксис Swift 5.1 😎
источник
.default
стиль учитывает темный режим и не документирован, поэтому, если вы также поддерживаете предыдущие версии iOS, вы можете добавить их,if #available(iOS 13, *) { return .darkContent } else { return .default }
если пытаетесь настроить стиль строки состояния вручную в соответствии с цвет за строкой состояния и этот цвет «яркий».Если вы хотите скрыть statusBar во время splashScreen, но хотите изменить стиль на светлое содержимое (StatusBarInitiallyHidden на Plist должно быть НЕТ, чтобы скрыть statusBar при заставке), вы можете добавить это в метод didFinishLaunchingWithOptions appDelegate, чтобы изменить его на lightContent.
источник
быстрый пример
в AppDelegate.swift
в наборе info.plist Просмотр внешнего вида строки состояния на основе контроллера: НЕТ
источник
Если вы используете
NavigationController
, вы можете создать подклассNavigationController
чтобы он обращался к своему дочернему контроллеру представления// MyCustomNavigationController
источник
Swift 4.2
источник
Вы можете установить стиль строки состояния. Она будет напоминать строку состояния, как в iOS 6 и ниже.
Вставьте эти методы в свой контроллер представления
и вызовите этот метод из вида, загрузился так
источник
[self setStatusBarNeedsUpdate]
во втором блоке? (Или хотя бы что-то еще).Я просто хочу добавить примечание для конкретного случая, с которым я столкнулся. В моем приложении был еще один UIWindow, чтобы отображать лицо чата, которое постоянно перемещалось по всему моему приложению. В результате ни одно из вышеперечисленных решений не сработало, и я не совсем уверен, почему! Все, что я заметил, это то, что причиной этого был мой ViewController в новом UIWindow! И если я хочу изменить стиль строки состояния, я должен сделать это в этом контроллере представления нового UIWindow.
Эта заметка может помочь другим, у кого подобная структура! Таким образом, вы можете применять упомянутые выше решения в ViewController нового UIWindow.
Опять же это частный случай.
Спасибо
источник
Для быстрого 3 в вашем UIViewController:
источник