Изменение строки состояния Цвет для конкретных ViewControllers с использованием Swift в iOS8
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
Используя приведенный выше код в любом ViewController, чтобы установить цвет statusBar в белый для определенного элемента управления представлением , не работает в iOS8 для меня. Какие-либо предложения? Используя метод UIApplication.sharedApplication, цвет изменяется после необходимых изменений в Info.plist для всего приложения.
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Как я могу просто внести изменения в цвет строки состояния для некоторых требуемых и конкретных ViewControllers?
Ответы
Ответ 1
Прочитав все предложения и попробовав несколько вещей, я мог бы заставить это работать для определенных контроллеров view, используя следующие шаги:
Первый шаг:
Откройте ваш info.plist и вставьте новый ключ с именем "Просмотр состояния панели управления на основе контроллера" на НЕТ
Второй шаг (просто объяснение, не нужно это реализовать):
Обычно мы помещаем следующий код в приложение (_: didFinishLaunchingWithOptions:)
метод AppDelegate,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
но это влияет на statusBarStyle
всех ViewControllers.
Итак, как заставить это работать для определенных ViewControllers - Final Step:
Откройте файл viewcontroller, где вы хотите изменить statusBarStyle
, и поместите следующий код в viewWillAppear()
,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
Кроме того, реализуйте метод viewWillDisappear()
для этого конкретного viewController и поместите следующие строки кода,
Swift 2
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default
}
Swift 3
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}
Этот шаг сначала изменит statusBarStyle
для конкретного диспетчера просмотров, а затем изменит его на default
, когда исчезает определенный диспетчер просмотра. Не реализуя viewWillDisappear()
, он будет постоянно менять statusBarStyle
на новое определенное значение UIStatusBarStyle.LightContent
Ответ 2
(По состоянию на 20 сентября 2019 г.)
Swift 4, Swift 4.2
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Ответ 3
Я последовал этому руководству, и это сработало для меня. Однако я не уверен, есть ли какие-либо оговорки.
https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift
- Откройте ваш info.plist и установите для
UIViewControllerBasedStatusBarAppearance
значение false
. - В первой функции в
AppDelegate.swift
, которая содержит didFinishLaunchingWithOptions
, установите didFinishLaunchingWithOptions
цвет.
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
Ответ 4
Решение Swift 4.2 с NavigationController
Первый шаг:
Откройте ваш info.plist и вставьте новый ключ с именем "Просмотр состояния панели управления на основе контроллера" или UIViewControllerBasedStatusBarAppearance
в YES, чтобы каждый VC использовал свое собственное свойство статуса.
Второй шаг
В каждом VC переопределить свойство preferredStatusBarStyle следующим образом:
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent //.default for black style
}
Последний шаг
Переопределите свойство preferredStatusBarStyle в вашем настраиваемом классе NavigationController:
class NavigationController : UINavigationController {
override var preferredStatusBarStyle : UIStatusBarStyle {
if let topVC = viewControllers.last {
//return the status property of each VC, look at step 2
return topVC.preferredStatusBarStyle
}
return .default
}
Ответ 5
Там миллиард ответов здесь, поэтому я подумал, почему бы не добавить другого в виде расширения (с помощью @Cœur)
Swift 3
Расширение:
extension UIApplication {
class var statusBarBackgroundColor: UIColor? {
get {
return (shared.value(forKey: "statusBar") as? UIView)?.backgroundColor
} set {
(shared.value(forKey: "statusBar") as? UIView)?.backgroundColor = newValue
}
}
}
Реализация:
UIApplication.statusBarBackgroundColor = .blue
Ответ 6
В вашем Info.plist вам необходимо определить View Status на панели управления для любого значения.
Если вы определяете его YES, тогда вы должны переопределить функцию preferredStatusBarStyle в каждом контроллере представления.
Если вы определяете его НЕТ, вы можете установить стиль в AppDelegate с помощью
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Ответ 7
override func viewWillAppear(animated: Bool) {
self.navigationController?.navigationBarHidden = true
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector("setBackgroundColor:") {
statusBar.backgroundColor = UIColor.redColor()
}
}
Ответ 8
SWIFT 2
Мне удалось успешно изменить внешний вид фона строки состояния, добавив в мое представлениеWillAppear следующее:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = .redColor()
}
Ответ 9
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.black
}
Это решение для установки цвета фона строки состояния для определенного контроллера вида.
Ответ 10
для быстрого 3
.plist
View controller-based status bar appearance = NO
AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Custom statubar
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = UIColor.gray
return true
}
Ответ 11
Внесите preferredStatusBarStyle
, как вы упомянули, и вызовите self.setNeedsStatusBarAppearanceUpdate()
в ViewDidLoad
и
также в Info.plist установите UIViewControllerBasedStatusBarAppearance
на YES
(It YES
по умолчанию)
Непонятно, почему он не работает. Мне нужно проверить код. Другое предложение
перейдите с рабочим кодом в ViewDidLoad
UIApplication.sharedApplication().statusBarStyle = .LightContent
и измените его на значение по умолчанию при просмотре get disappeared viewWillDisappear
.
Ответ 12
В моей ситуации я использую раскадровку для организации своих диспетчеров вида. Я хочу изменить весь стиль строки состояния.
Вы можете видеть на рисунке ниже.
![введите описание изображения здесь]()
Stars
View Controller - это CPBaseNavigationController
, а CPBaseNavigationController
- подкласс UINavigationController
.
Я пытаюсь выполнить следующие настройки:
-
В AppDelegate.swift
func didFinishLaunchingWithOptions
добавьте
//change status bar color
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
но никакого эффекта.
-
В StoryBoard найдите Base Tab BarController
(рисунок выше). Выберите Attributes Inspector
, измените атрибут Sattus Bar
на Light Content
.so плохой, никакого эффекта.
![введите описание изображения здесь]()
-
В последнее время я получаю его. В моем настраиваемом контроллере навигации CPBaseNavigationController
добавьте func preferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return .LightContent
}
Это хорошо работает!
Кроме того, statusBarStyle
устарел в 9.0, вы можете использовать -[UIViewController preferredStatusBarStyle]
.
Ответ 13
Работа для навигационного приложения
var addStatusBar = UIView()
addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
self.window?.rootViewController?.view .addSubview(addStatusBar)
Ответ 14
В Swift 3.0 Xcode 8 все намного проще
Используя приведенный ниже код в файле делегата приложения, после
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
вставьте это:
UINavigationBar.appearance().barStyle = .black
UINavigationBar.appearance().barTintColor = UIColor(red: 230, green: 32, blue: 31, alpha: 1.0)
Ответ 15
Swift 3
//
// LoginController.swift
// Swift 3
//
// Created by The Crab on 17/01/2017.
// Copyright © 2017 Paxi Labs. All rights reserved.
//
import UIKit
class LoginController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
setNeedsStatusBarAppearanceUpdate()
view.backgroundColor = UIColor(red: 61/255, green: 91/255, blue: 151/255, alpha: 1)
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Ответ 16
Swift 4 Для конкретного ViewController без встроенного навигационногоViewController добавьте это в свой файл ViewController.
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Ответ 17
Другой действительно простой способ сделать это - просто создать расширение класса UINavigationController.
Поскольку переопределение preferredStatusBarStyle:
метод StatusBarStyle preferredStatusBarStyle:
будет работать UNLESS, мы делаем это внутри класса UINavigationController.
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Ответ 18
Я установил определенный цвет (в формате RGB), используя ниже код в файле App Delegate
:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
. . .
UIApplication.sharedApplication().statusBarHidden = false
UIApplication.sharedApplication().statusBarStyle = .LightContent
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = UIColor.init(red: 0.1, green: 0.27, blue: 0.60, alpha: 1.0)
}
. . .
}
Вам также нужно добавить ниже ключ в файл Info.plist
:
Просмотр состояния строки состояния на основе контроллера с логическим значением, установленным на НЕТ
![Снимок экрана 1]()
![Снимок экрана 2]()
Ответ 19
Я могу предложить вам более простой способ,
Вызвать этот метод, если атрибуты строки состояния контроллера просмотра, такие как скрытый/незакрытый статус или стиль, изменяются. Если вы вызовете этот метод в блоке анимации, изменения будут анимированы вместе с остальной частью блока анимации.
- Внесите preferredStatusBarStyle, возвращая ваш предпочтительный тип.
Это работало для меня в iOS 10.1.
Цель C
[self setNeedsStatusBarAppearanceUpdate];
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
Swift
setNeedsStatusBarAppearanceUpdate()
var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Я удивлен, что никто этого не заметил. В любом случае наслаждайтесь:)
Ответ 20
У меня были проблемы с этим. Я действительно не чувствовал себя хорошо в глобальном изменении цвета строки состояния в поле зрения, и затем изменение его на вид исчезло, как принятый ответ. Верьте или нет, вы можете получить эту работу, переопределив preferredStatusBarStyle
на вашем желаемом контроллере. После долгого времени это то, что я сделал, чтобы заставить его работать:
- Измените вид строки состояния на основе контроллера в
info.plist
на YES.
- Теперь любой контроллер полного экрана может изменить стиль строки состояния, переопределив
preferredStatusBarStyle
.
- Я указываю полноэкранный режим, потому что это не будет работать для (не полноэкранных) контроллеров модального просмотра, не без установки
modalPresentationCapturesStatusBarAppearance
в Да, который есть.
-
Кроме того, если у вас встроенные контроллеры представлений, например, например, в контроллере навигации, он попросит контроллер верхнего уровня для стиля строки состояния. Переопределение childViewControllerForStatusBarStyle
и передача встроенного контроллера представления должны работать, но это не для меня. Поэтому я просто вернул выбранную строку статуса встроенных контроллеров представлений как предпочтительный стиль строки состояния. Что-то вроде этого:
override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
Ответ 21
Обновление Swift 3.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarStyle = .lightContent
return true
}
Ответ 22
Что со мной работало, в раскадровке, перейдите в контроллер навигации, выберите навигационную панель, нажмите "Инспектор атрибутов", а затем измените стиль по умолчанию на черный. Что это!
Ответ 23
В Swift 4 или 4.2
Вы можете добавить на свой вк
preferredStatusBarStyle
и установите возвращаемое значение
.lightContent или .default
например:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Ответ 24
Нажмите на группу поддерживающих файлов (слева вверху - название вашего проекта). Перейдите к информации. Нажмите + где-то между списками, например, ниже имени пакета. И добавьте "Просмотр строки состояния на основе контроллера" и установите для него значение НЕТ.
Затем откройте AppDelegate.swift и измените так:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
return true
}
Вот оно.
Ответ 25
Я буквально попал в эту же проблему. Мне потребовалось более 4 часов, чтобы понять это. Я пробовал все ответы, приведенные здесь, и лучшее, что я получил, - это получить заголовок в строке состояния белый. Но другие биты, такие как батарейный отсек и другие, были все еще черными, независимо от того, что я сделал: относительно применения всех решений, предоставляемых в этом вопросе. Поэтому я решил вернуться назад и понял, что загрузил зависимость CocoaPod, которая изменяла обычные функциональные возможности Xcode и коды для изменения цветов. Для меня это была зависимость "ChameleonFramework". Поэтому я бы посоветовал вам проверить свои зависимости, которые вы установили из CocoaPods, удалив последние, если вы применили все решения и не работаете на вас.
Ответ 26
Для Xcode 10 вы можете создать класс и поместить его перед классом viewController, вы можете вызвать этот класс во всем контроллере просмотра, требуется строка состояния светлого контента...
class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}
Теперь измените класс viewController в:
class YourViewController: UIViewControllerWithLightStatusBar {
...
}
И что все...
Ответ 27
SWIFT 4.2 Привет, я хотел бы поделиться решением, которое сработало для меня, которое я получил из отличной статьи Грейг Груммитта на эту захватывающую тему.
Шаг 1 Как уже упоминалось ниже, ДОБАВЬТЕ в свой PLIST
View controller-based status bar appearance YES
Шаг 2 в RootViewcontroller добавить ниже
var statusBarHidden: Bool = false {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var prefersStatusBarHidden: Bool {
return statusBarHidden
}
var vcStatusBarStyle: UIStatusBarStyle = .default {
didSet(newValue) {
UIView.animate(withDuration: 0.1) {
self.setNeedsStatusBarAppearanceUpdate()
}
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return vcStatusbarStyle
}
При обновлении либо свойство statusBarHidden
или vcStatusBarStyle
он будет вызывать setNeedsStatusBarAppearanceUpdate()
и будет обновлять строку состояния с новыми значениями для обоих prefersStatusBarHidden
или preferredStatusBarStyle
. В моей ситуации мне пришлось обновить эти свойства для контейнера viewcontroller, который был родителем видимого childviewcontroller. Я сделал это с помощью простого метода делегата.
protocol MainViewControllerDelegate {
func updateStatusBarStyle(statBarStayle: UIStatusBarStyle)
func toggleStatusBar(visable: Bool)
}
Конечно, при создании экземпляра childViewController (Visible VC) не забудьте установить MainViewcontroller (Container VC) в качестве его делегата. Я иногда делаю. :)
childViewController.delegate = self
Затем в childViewController я просто вызвал метод делегата, когда необходимо обновить строку состояния.
self.delegate?.updateStatusBarStyle(statBarStayle: .default)
Как упоминалось выше, Грейг Груммитт более подробно рассказывает об этом решении, а также о работе с UINavigationControllers. Ссылка здесь: таинственный случай строки состояния
Ответ 28
Работает для навигации на основе конкретного контроллера представления в swift4
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
Ответ 29
ПРЕДУПРЕЖДЕНИЕ
Сеттер для statusBarStyle устарел в iOS 9.0: Использование - [UIViewController предпочитаемыйStatusBarStyle]
UIApplication.shared.statusBarStyle = .default
поэтому мое решение было следующим: создание расширения из контроллера навигации:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = presentedViewController{
return topViewController.preferredStatusBarStyle
}
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
}
и если у вас есть viewController, который будет иметь другой стиль, чем стиль приложения, вы можете сделать это
var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
return barStyle
}
.default
что стиль состояния вашего приложения - .default
и вы хотите, чтобы этот экран был .lightContent
поэтому barStyle примет значение .lightContent
качестве значения по умолчанию, это изменит стиль строки состояния на lightContent, а затем убедитесь, что когда viewWillDisappear
изменит barStyle снова в стиле строки состояния приложения, который в нашем случае является .default
.
это работает для меня
Ответ 30
Swift 3
В вашем AppDelegate
файле внутри метода func application
let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red