Изменение цвета строки состояния для определенных ViewControllers с помощью Swift в iOS8
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
используя приведенный выше код в любом ViewController, чтобы установить цвет строки состояния на белый для определенного viewcontroller не работает в iOS8 для меня. Есть предложения? Использование UIApplication.метод sharedApplication, цвет изменяется после необходимых изменений в информации.plist для всего приложения.
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Как я могу просто внести изменения в цвет строки состояния для некоторых необходимых и конкретные ViewControllers?
24 ответов
прочитав все предложения и попробовав несколько вещей, я мог бы заставить это работать для конкретных viewcontrollers, используя следующие шаги:
Первый Этап:
откройте свою информацию.plist и вставляем новый ключ с именем " вид контроллера на основе строки состояния внешний вид " to нет
второй шаг (просто объяснение, нет необходимости реализовывать это):
обычно мы помещаем следующий код в приложение (_: didFinishLaunchingWithOptions:) метод AppDelegate,
Swift 2
UIApplication.sharedApplication().statusBarStyle = .LightContent
Swift 3
UIApplication.shared.statusBarStyle = .lightContent
а то влияет statusBarStyle
всех ViewControllers.
Итак, как заставить это работать для конкретных ViewControllers-Final Шаг:
откройте файл 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
для конкретного viewcontroller, а затем измените его обратно на default
когда конкретный viewcontroller исчезает. Не реализуя viewWillDisappear()
изменить statusBarStyle
бессрочно по новой сумме UIStatusBarStyle.LightContent
(по состоянию на 23 мая 2018 года)
Swift 3 и Swift 4
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
UIApplication.shared.statusBarStyle = .lightContent
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
я следовал этому руководству, и это сработало для меня. Однако я не уверен, есть ли какие-либо оговорки.
https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift
- откройте свою информацию.plist и установить
UIViewControllerBasedStatusBarAppearance
доfalse
. - в первой функции в
AppDelegate.swift
, которая содержитdidFinishLaunchingWithOptions
, установите цвет, который вы хотите.
UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent
-
Swift 3 Update *
UIApplication.общий.statusBarStyle = .lightContent
в вашей информации.plist вам нужно определить внешний вид строки состояния на основе контроллера вида для любого значения.
Если вы определяете его да, то вы должны переопределить функцию preferredStatusBarStyle в каждом контроллере представления.
Если вы определяете его нет, то вы можете установить стиль в AppDelegate, используя
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
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()
}
}
здесь есть миллиард ответов, поэтому я подумал, почему бы не добавить еще один в виде расширение (С помощью @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
SWIFT 2
я смог успешно изменить внешний вид фона строки состояния, добавив следующее в моем viewWillAppear:
let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView
if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
statusBar.backgroundColor = .redColor()
}
Swift 3
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = UIColor.black
}
это решение для установки цвета фона строки состояния для конкретного контроллера вида.
реализовать preferredStatusBarStyle
Как вы упомянули, и называют self.setNeedsStatusBarAppearanceUpdate()
на ViewDidLoad
и
также В информация.plist set UIViewControllerBasedStatusBarAppearance
to YES
(это YES
по умолчанию)
непонятно, почему он не работает.Мне нужно проверить код.Еще одно предложение
перейти с рабочим кодом в viewDidLoad
UIApplication.sharedApplication().statusBarStyle = .LightContent
изменить это, чтобы по умолчанию при просмотре исчезли viewWillDisappear
.
в моей ситуации я использую раскадровку для организации контроллеров вида.Я хочу изменить стиль строки состояния.
вы можете увидеть на рисунке ниже.
Stars
контроллер вида-это CPBaseNavigationController
и CPBaseNavigationController
- это подкласс UINavigationController
.
я стараюсь делать следующий setps:
-
на
AppDelegate.swift
funcdidFinishLaunchingWithOptions
добавьте//change status bar color UIApplication.sharedApplication().statusBarHidden = false UIApplication.sharedApplication().statusBarStyle = .LightContent
но нет эффект.
в раскадровке, найти
Base Tab BarController
(картинка выше).выберитеAttributes Inspector
изменитьSattus Bar
атрибутLight Content
.так плохо, никакого эффекта.
-
последнее, что я понял.В моем пользовательском навигационном контроллере
CPBaseNavigationController
добавить кнопку funcpreferredStatusBarStyle
override func preferredStatusBarStyle() -> UIStatusBarStyle { return .LightContent }
он работает хорошо!
кроме того,statusBarStyle
deprecated в 9.0,вы можете использовать -[UIViewController preferredStatusBarStyle]
.
для swift 3
.файл plist
View controller-based status bar appearance = NO
AppDelegate.Свифт!--3-->
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
}
работает для навигационного приложения
var addStatusBar = UIView()
addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
self.window?.rootViewController?.view .addSubview(addStatusBar)
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
}
}
все намного проще в 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)
Я установил определенный цвет (в формате RGB), используя ниже код в :
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)
}
. . .
}
Вам также нужно добавить ниже ключ в :
вид контроллера на основе строки состояния внешний вид с логическим значением нет
Swift 4 для конкретного ViewController без встроенного navigationViewController просто добавьте это в файл ViewController.
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
Я могу предложить вам более простой способ,
- просто позвони setNeedsStatusBarAppearanceUpdate в viewDidLoad, как говорит Apple docs,
вызовите этот метод, если атрибуты строки состояния контроллера вида, такие как скрытый/неявный статус или стиль, изменяются. Если вы вызываете этот метод в блоке анимации, изменения анимируются вместе с остальной частью блока анимации.
- выполнить preferredStatusBarStyle возврат предпочитаемого типа.
это работает для меня в iOS 10.1.
Цель C
[self setNeedsStatusBarAppearanceUpdate];
-(UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
Свифт
setNeedsStatusBarAppearanceUpdate()
var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Я удивлена, что никто не указал на это. В любом случае, наслаждайтесь :)
у меня были некоторые проблемы с этим. Я действительно не чувствовал себя хорошо о глобальном изменении цвета строки состояния в поле зрения появился, а затем изменить его обратно на вид исчез, как принятый ответ. Верьте или нет вы можете сделать это путем переопределения preferredStatusBarStyle
на желаемом контроллере вида. После долгого времени это то, что я сделал, чтобы заставить его работать:
- изменить вид контроллера на основе строки состояния внешний вид в вашем
info.plist
"да". - теперь любой полный контроллер просмотра экрана может изменить стиль строки состояния, переопределив
preferredStatusBarStyle
. - Я указываю полный экран, потому что это не будет работать для (не полный экран) модальных контроллеров просмотра, не без настройки
modalPresentationCapturesStatusBarAppearance
Да, это так. -
кроме того, если у вас есть встроенные контроллеры вида, например, в навигационном контроллере, он попросит верхний контроллер вида для стиля строки состояния. Переопределение
childViewControllerForStatusBarStyle
и передача встроенного контроллера вида должна работать, но не для меня. Поэтому я просто вернул предпочтительную строку состояния встроенных контроллеров представления в качестве предпочтительного стиля строки состояния. Что-то вроде этого:--7-->override var preferredStatusBarStyle: UIStatusBarStyle { if let topViewController = viewControllers.last { return topViewController.preferredStatusBarStyle } return .default }
Обновление Swift 3.0
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.statusBarStyle = .lightContent
return true
}
нажмите на группу файлов поддержки (верхнее имя проекта слева). Перейдите к информации. Нажмите на + где-то между списками, как показано ниже имя пакета. И добавьте "View controller-based status bar appearence" и установите его в НЕТ. Затем откройте AppDelegate.swift и изменить следующим образом:
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
return true
}
вот и все.
Я буквально попал в такую же проблему. Мне потребовалось более 4 часов, чтобы понять это. Я пробовал все ответы, приведенные здесь, и лучшее, что я получил, это получить заголовок в строке состояния белый. Но другие биты, такие как панель батареи и другие, все еще были черными, независимо от того, что я делал: относительно применения всех решений, предусмотренных в этом вопросе. Поэтому я решил вернуться к своим шагам и узнал, что я загрузил зависимость CocoaPod, которая изменяла нормальные функции Xcode и коды менять цвет. Для меня это была зависимость от "хамелеона". Поэтому я бы посоветовал вам проверить свои зависимости, которые вы установили из CocoaPods, удалив самые последние, Если вы применили все решения и не работаете на вас.
что работало со мной, в раскадровке перейдите в навигационный контроллер, выберите Панель навигации, нажмите на инспектор атрибутов, затем измените стиль с default на black. Вот так!
Swift 3
в своем внутри func application
метод
let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red
Swift 4.0 пожалуйста, используйте этот код в "didFinishLaunchingWithOptions launchOptions:" класс Appdelegate
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }