Я использую Xcode 8.0 beta 4.
В предыдущей версии UIViewController имел метод для установки стиля строки состояния
public func preferredStatusBarStyle() -> UIStatusBarStyle
Тем не менее, я обнаружил, что в Swift 3 он изменился на «Get ONLY varaiable».
public var preferredStatusBarStyle: UIStatusBarStyle { get }
Как обеспечить стиль для использования в моем UIViewController?
Ответы:
[ОБНОВЛЕНО] Для Xcode 10+ и Swift 4.2+
Это предпочтительный метод для iOS 7 и выше
В вашем приложении
Info.plist
установитеView controller-based status bar appearance
наYES
.Переопределите
preferredStatusBarStyle
( Apple Docs ) в каждом из ваших контроллеров представления. Например:Если вы
preferredStatusBarStyle
возвращаете другой предпочтительный стиль строки состояния, основанный на чем-то, что изменяется внутри вашего контроллера представления (например, позиция прокрутки или отображаемое изображение темное), то вы захотите позвонить,setNeedsStatusBarAppearanceUpdate()
когда это состояние изменится.iOS до версии 7, устаревший метод
Apple это устарела , поэтому она будет удалена в будущем. Используйте описанный выше метод, чтобы вам не приходилось переписывать его при выходе следующей версии iOS.
Если ваше приложение будет поддерживать In вашего приложения
Info.plist
, установитеView controller-based status bar appearance
вNO
.В
appDelegate.swift
, вdidFinishLaunchingWithOptions
функции, добавьте:Для контроллера навигации
Если вы используете навигацию контроллер и вы хотите , предпочтительный статус бара стиль каждого контроллера представления для использования и установить
View controller-based status bar appearance
наYES
в вашем Прикладномinfo.plist
источник
Последнее обновление (Xcode 10+ / Swift 4.2+)
Эта статья оставлена без изменений для тех, кто хочет понять логику различных подходов, которые присутствовали в течение последних нескольких лет. Между тем, начиная с Xcode 10, первый подход Swift 4.2 устарел и больше не поддерживается (т.е. не вступит в силу, если вы попытаетесь использовать его). Он по-прежнему используется для вашей информации, чтобы лучше понять обоснование
Plist.info
флага и практику настройки.Важное уточнение
Очень важно понимать два подхода к настройке внешнего вида строки состояния. Они разные и не должны смешиваться.
Первый подход - один цвет для всего приложения (УСТАРЕЛО начиная с iOS7)
В info.plist вы найдете или создадите ключ с именем
View controller-based status bar appearance
и установите его в NO .
Что оно делает? По сути, он устанавливает параметр, который говорит, что в вашем приложении внешний вид строки состояния не определяется индивидуально каждым контроллером представления . Это очень важно понять. Это означает, что у вас есть единые настройки для всего приложения, для всех экранов. Существует две настройки:
default
черный текст на белом фоне илиlightContent
белый текст на черном фоне.Чтобы настроить один из них ( один параметр для всех экранов ):
Таким образом, вам не нужно восстанавливать этот параметр на каждом контроллере представления. Тем не менее, вы всегда можете прибегнуть к этому методу, чтобы добровольно изменить внешний вид.
Второй подход - индивидуальный цвет для каждого контроллера вида
Это наоборот. Чтобы заставить его работать, перейдите к info.plist и установите
View controller-based status bar appearance
в ДА
Таким образом, всякий раз, когда новый контроллер представления открыт, стиль строки состояния устанавливается индивидуально, если вы вставляете эту реализацию в каждый
UIViewController
необходимый вам экземпляр:У вас так же, как в первом, установить темный или светлый стиль для строки состояния, индивидуально для каждого контроллера представления.
Это свойство выбирается UIKit в двух сценариях:
setNeedsStatusBarAppearanceUpdate()
в коде.В последнем случае вы имеете право манипулировать внешним видом строки состояния с помощью следующего кода:
Затем, всякий раз, когда вы звоните
toggleAppearance()
, изменение стиля строки состояния будет вызвано.Третий подход - взломать!
Есть взлом, который позволяет получить доступ к строке состояния напрямую:
Зачем взламывать? Если вам нужен цвет строки состояния, отличный от черного или белого, вы используете недокументированный API. Вы получаете
statusBar
объект с помощью KVC и устанавливаете его цвет фона. Объект, который вы получаете таким образомUIStatusBar
, является производнымUIView
и, таким образом, естественно поддерживаетbackgroundColor
свойство. Это грязный, недопустимый способ, но пока это единственный способ настроить пользовательский цвет для строки состояния (без учетаUINavigationBar
подхода, который позволяет полностью настроить внешний вид панели навигации и строки состояния). Это может привести к отклонению вашего приложения. Но, возможно, тебе повезло. И если это так, в некоторых сложных обстоятельствах (например, иерархия вложенных, дочерних контроллеров и контроллеров представления) это может быть в значительной степени единственным или, по крайней мере, менее сложным способом настройки внешнего вида строки состояния (например, чтобы сделать ее прозрачной)Xcode 10+, Swift 4.2
Альтернатив больше нет: разработчик должен позволить каждому контроллеру представления определять внешний вид строки состояния, устанавливая флаг в YES (или опуская это действие, потому что это YES по умолчанию) и следуя приведенным выше инструкциям.
бонус
Решение на основе хака, которое вы можете (хотя и не рекомендуется) использовать в сложных обстоятельствах, чтобы добровольно изменить внешний вид строки состояния на любом этапе. Что касается цвета, следующий метод расширения делает именно то, что вы могли бы сделать с обычным подходом. Вы можете настроить его под свои нужды.
источник
Вы можете попытаться переопределить возвращаемое значение, а не устанавливать его. Метод объявлен как {get}, поэтому просто предоставьте получатель:
Если вы установите это условно, вам нужно будет позвонить,
setNeedsStatusBarAppearanceUpdate()
чтобы он оживил изменение, когда вы будете готовыисточник
prefersStatusBarHidden
некоторые из ваших взглядов. Если вы идете сUIApplication.shared.statusBarStyle
вами, вы застряли с этим.Swift 3 & 4, iOS 10 & 11, Xcode 9 & 10
Для меня этот метод не работает:
когда я привык к каждому контроллеру представления, но это работало:
В файле info.list добавьте строку:
View controller-based status bar appearance
и установите дляNO
Далее в приложении:
источник
Если вы хотите изменить
statusBar
цвет на белый, для всех представлений, содержащихся в aUINavigationController
, добавьте это внутрьAppDelegate
:Этот код:
не работает на
UIViewControllers
содержащийся вUINavigationController
, потому что внешний компилятор дляstatusBarStyle
изUINavigationController
, не дляstatusBarStyle
изViewControllers
содержащихся него.Надеюсь, что это поможет тем, кому не удалось принять принятый ответ!
источник
Если вы хотите изменить стиль строки состояния в любое время после появления представления, вы можете использовать это:
В файле info.list добавить строку: просмотреть внешний вид строки состояния контроллера и установить для нее значение YES
источник
If you call this method within an animation block, the changes are animated along with the rest of the animation block.
Xcode 10 или позже
Проверено в Swift 5
Код не требуется, просто следуйте инструкциям ниже.
Не забудьте изменения info.plist
Запустите свой проект и проверьте его.
Мой проект в Swift 5 и Xcode 10.2 и 11.0
источник
Вам необходимо добавить ниже ключ в вашем файле Info.plist:
View controller-based status bar appearance
с логическим значением, установленным наNO
В вашем классе appdelegate, в
didFinishLaunchingWithOptions
методе перед возвратом.изменить
backgroundColor
иstatusBarStyle
согласно требованию.источник
Вы также можете сделать это в раскадровке
Вы должны будете сделать это для каждого имеющегося у вас контроллера навигации. Однако любые представления под этим контроллером навигации изменят стиль / цвет всех строк состояния представления на тот, который вы только что выбрали. Я нахожу этот вариант лучше, потому что вы можете видеть свои результаты мгновенно и не нужно добавлять лишние строки кода в каждом контроллере представления.
(Сделано с Xcode 8.3.3 во всем проекте Swift)
источник
View controller-based status bar appearance = NO
и использованием только светлого или темного стиля во всем приложении. Жаль, что этот «без кода» способ работает только в Navigation Controller, Apple следует рассмотреть возможность добавления другого поля для настройки этой опции в любом экземпляре View Controller.Для людей, которые хотят изменить строку состояния для всех контроллеров представления на: iOS 11, решение Swfit 4/5 довольно просто.
1) Info.plist добавить:
2) Левая сторона проекта XCode slect> Цели > Выберите проект> В разделе «Общие»> «Информация о развертывании»> Выбрать стиль строки состояния: свет
Если вы хотите изменить строку состояния только для одного viewcontroller , на viewDidLoad добавьте:
2.1 ) Info.plist
2.2 )
Objective-C (или реагировать нативно) меняется с App Delegate:
1) Info.plist добавить:
2) AppDelegate -> didFinishLaunchingWithOptions
Изменение строки состояния не работает при попытке сделать push (навигационные контроллеры), только при представлении модально viewcontrollers.
источник
Для первого шага вам нужно добавить строку с ключом:
View controller-based status bar appearance
и значениемNO
вInfo.plist
файл. После этого добавьте 2 функции в вашем контроллере только для того, чтобы этот контроллер действовал:источник
Swift 3
В Info.plist добавьте строку с именем «Просмотр внешнего вида строки состояния на основе контроллера» и установите для нее значение
No
.источник
Кажется, есть небольшая проблема с цветом текста строки состояния при работе с панелями навигации.
Если вы хотите, чтобы запись .plist отображала внешний вид строки состояния на основе контроллера
YES
, иногда она не будет работать, если у вас есть цветная навигационная панель.Например:
и
override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}
Приведенный выше код не будет работать, даже если вы установили следующее в AppDelegate:
UIApplication.shared.statusBarStyle = .lightContent
Для тех, кто все еще борется, очевидно, он каким-то образом решает, должна ли строка состояния быть светлой или темной по стилям в навигационной панели. Итак, мне удалось это исправить, добавив следующую строку в viewWillAppear:
nav?.barStyle = UIBarStyle.black
Когда стиль бара черный, он слушает вашу переопределенную переменную. Надеюсь, это поможет кому-то :)
источник
Чтобы добавить в великий asnwer @Krunal https://stackoverflow.com/a/49552326/4697535
В случае, если вы используете
UINavigationController
, неpreferredStatusBarStyle
будет влиять наUIViewController
.Xcode 10 и Swift 4.
Установить пользовательский
UINavigationController
Пример:
Используйте расширение для решения уровня приложения:
источник
Xcode 8.3.1, Swift 3.1
Создайте новую запись в info.plist «Просмотр внешнего вида строки состояния на основе контроллера» и установите для нее значение «НЕТ».
Откройте AppDelegate.swift и добавьте эти строки в методе didFinishLaunchingWithOptions:
application.statusBarStyle = .lightContent
источник
Свифт 4+
для белого текста в строке состояния:
источник
Вот Apple Guidelines / Инструкция по изменению стиля строки состояния.
Если вы хотите установить статус стиль бар, уровень приложений , а затем установить
UIViewControllerBasedStatusBarAppearance
наNO
в вашем.plist
файле. И в вашемappdelegate
>didFinishLaunchingWithOptions
добавьте следующий раздел (программно вы можете сделать это из приложения делегата).Цель С
стриж
если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:
UIViewControllerBasedStatusBarAppearance
значениеYES
в.plist
файле, если вам нужно установить стиль строки состояния только на уровне UIViewController.В viewDidLoad добавить функцию -
setNeedsStatusBarAppearanceUpdate
переопределите предпочитаемый элемент StatusBarStyle в вашем контроллере представления
Цель С
стриж
Установите значение .plist в соответствии с уровнем настройки стиля строки состояния.
источник
Swift 4.0 Пожалуйста, используйте этот код в "didFinishLaunchingWithOptions launchOptions:" Класс Appdelegate
источник
iOS 11.2
источник
Это сработало для меня
Установите
View controller-based status bar
внешний вид в NO в plist, затем в InUIViewController
viewDidAppear
просто добавьте следующую строкуисточник
Свифт 3
если Просмотр строки состояния на основе контроллера = ДА в Info.plist
затем используйте это расширение для всех NavigationController
если UINavigationController отсутствует и имеется только UIViewController, используйте код ниже:
источник
Swift 5
Чтобы добавить более подробную информацию об ответе PRAVEEN по адресу https://stackoverflow.com/a/40066798/2082851 , я хотел бы представить свою реализацию. Он поддерживает гибкость настройки строки состояния каждого контроллера.
В общем, мы создадим свойство,
BaseViewController
которое будет обрабатывать этоstatusBarStyle
свойство во всех случаях. Когда вы создаете новый контроллер, сделайте его подклассом этого базового контроллера.Всякий раз, когда вы хотите изменить внешний вид статуса, вам нужно только обновить это свойство. Стиль строки состояния будет обновлен немедленно.
Реализация
демонстрация
2.
UINavigationController
Ведь
UINavigationController
это особый случай, за которым вы можете следовать любым решениям:Решение A: переопределить с отправкой сообщения
Так как UINavigationController является
NSObject
и наследуетсяObjectiveC
, его методы есть,message dispatch
и вы можете переопределить их.Решение B: Создать
UINavigationController
подклассЕсли у вас уже есть кастом
UINavigationController
(который обычно должен контролировать больше требований), это лучшее решение для вас.источник
Вы можете использовать свойство bool с именем «shouldStatusBarDark» для переключения цвета строки состояния. И вы также можете обновить его значение, чтобы изменить цвет строки состояния при прокрутке.
источник
Большинство из этих ответов повторяются, но ни один из них не обращается к экрану запуска для меня при использовании темного фона.
Я обошел это со следующим в моем,
info.plist
который произвел легкую стилизованную строку состояния.источник
Если вы получаете предупреждение: Setter для 'statusBarStyle' устарел в iOS 9.0: Используйте - [UIViewController предпочитаемыйStatusBarStyle] , затем для установки строки состояния на светлый или темный используйте следующий код:
Это не заставит ваш navBar изменить его, он просто указывает на стиль и, следовательно, соответственно меняет строку состояния.
NB. Вы должны убедиться, что вы установили в своем info.plist.
источник
Если вы используете модальную презентацию, вам нужно установить:
источник
В iOS 13 вы можете использовать
.darkContent
UIStatusBarStyle
свойство для отображения темной строки состоянияисточник
Если вы все еще не можете изменить стиль строки состояния базы на метод
Вы можете попробовать использовать этот метод:
источник
Для цели C просто добавьте эту строку в ваше приложение с помощью метода didFinishLaunch.
источник
используя WebkitView
Swift 9.3 iOS 11.3
источник