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

1078   24  

24 ответов:

прочитав все предложения и попробовав несколько вещей, я мог бы заставить это работать для конкретных viewcontrollers, используя следующие шаги:

Первый Этап:

откройте свою информацию.plist и вставляем новый ключ с именем " внешний вид строки состояния на основе контроллера" к нет

второй шаг (просто объяснение, не нужно осуществлять это):

обычно мы помещаем следующий код в приложение (_: 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 Обновление*

    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() in ViewDidLoad и также В Инфо.plist set UIViewControllerBasedStatusBarAppearance до YES (это YES по умолчанию)

непонятно, почему это не работает.Мне нужно проверить код.Еще одно предложение: перейти с рабочим кодом в viewDidLoadUIApplication.sharedApplication().statusBarStyle = .LightContent и измените это на значение по умолчанию, когда вы просматриваете get disappeared viewWillDisappear.

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

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

enter image description here

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

я пытаюсь сделать следующие наборы:

  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. последнее, что я получаю it.In мой пользовательский навигационный контроллер 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.Свифт

  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), используя ниже код в App Delegate file:

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 file:

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

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.

С

[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 и передача встроенного контроллера вида должна работать, но это не для меня. Поэтому я просто вернул встроенные контроллеры представления предпочтительной строки состояния в качестве предпочтительного стиля строки состояния. Что-то вроде этого:

    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
    }

нажмите на группу вспомогательных файлов (слева вверху-имя вашего проекта). Перейдите к информации. Нажмите на + где-то между списками, как показано ниже имя пакета. И добавить "вид контроллера на основе строки состояния 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 class

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 }

Comments

    Ничего не найдено.