Изменение цвета строки состояния для определенных 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.


в моей ситуации я использую раскадровку для организации контроллеров вида.Я хочу изменить стиль строки состояния.

вы можете увидеть на рисунке ниже.

enter image description here

Stars контроллер вида-это CPBaseNavigationControllerи CPBaseNavigationController - это подкласс UINavigationController.

я стараюсь делать следующий setps:

  1. на AppDelegate.swift func didFinishLaunchingWithOptionsдобавьте

    //change status bar color
    UIApplication.sharedApplication().statusBarHidden = false
    UIApplication.sharedApplication().statusBarStyle = .LightContent
    

    но нет эффект.

  2. в раскадровке, найти Base Tab BarController(картинка выше).выберите Attributes Inspector изменить Sattus Bar атрибут Light Content.так плохо, никакого эффекта.

enter image description here

  1. последнее, что я понял.В моем пользовательском навигационном контроллере CPBaseNavigationControllerдобавить кнопку func preferredStatusBarStyle

    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)
        }

. . .
}

Вам также нужно добавить ниже ключ в :

вид контроллера на основе строки состояния внешний вид с логическим значением нет

Screenshot 1

Screenshot 2


Swift 4 для конкретного ViewController без встроенного navigationViewController просто добавьте это в файл ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Я могу предложить вам более простой способ,

  1. просто позвони setNeedsStatusBarAppearanceUpdate в viewDidLoad, как говорит Apple docs,

вызовите этот метод, если атрибуты строки состояния контроллера вида, такие как скрытый/неявный статус или стиль, изменяются. Если вы вызываете этот метод в блоке анимации, изменения анимируются вместе с остальной частью блока анимации.

  1. выполнить preferredStatusBarStyle возврат предпочитаемого типа.

это работает для меня в iOS 10.1.

Цель C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Свифт

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

Я удивлена, что никто не указал на это. В любом случае, наслаждайтесь :)


у меня были некоторые проблемы с этим. Я действительно не чувствовал себя хорошо о глобальном изменении цвета строки состояния в поле зрения появился, а затем изменить его обратно на вид исчез, как принятый ответ. Верьте или нет вы можете сделать это путем переопределения preferredStatusBarStyle на желаемом контроллере вида. После долгого времени это то, что я сделал, чтобы заставить его работать:

  1. изменить вид контроллера на основе строки состояния внешний вид в вашем info.plist "да".
  2. теперь любой полный контроллер просмотра экрана может изменить стиль строки состояния, переопределив preferredStatusBarStyle.
  3. Я указываю полный экран, потому что это не будет работать для (не полный экран) модальных контроллеров просмотра, не без настройки modal​Presentation​Captures​Status​Bar​Appearance Да, это так.
  4. кроме того, если у вас есть встроенные контроллеры вида, например, в навигационном контроллере, он попросит верхний контроллер вида для стиля строки состояния. Переопределение child​View​Controller​For​Status​Bar​Style и передача встроенного контроллера вида должна работать, но не для меня. Поэтому я просто вернул предпочтительную строку состояния встроенных контроллеров представления в качестве предпочтительного стиля строки состояния. Что-то вроде этого:--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 }