Изменение цвета строки состояния для определенных ViewControllers с помощью Swift в iOS8

override func preferredStatusBarStyle() -> UIStatusBarStyle {
 return UIStatusBarStyle.LightContent;
}

Использование приведенного выше кода в любом ViewController для установки цвета statusBar на Белый для определенного viewcontroller не работает в iOS8 для меня. Какие-либо предложения? Используя метод UIApplication.sharedApplication, цвет меняется после необходимых изменений в Info.plist для всего приложения.

// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent

Как я могу просто внести изменения в цвет строки состояния для некоторых необходимых и определенных ViewControllers?

26 ответов

ПРЕДУПРЕЖДЕНИЕ


Сеттер для 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 и вы хотите, чтобы этот экран был .lightContentтак что barStyle возьмет .lightContent в качестве значения по умолчанию это изменит стиль строки состояния на lightContent, а затем убедитесь, что viewWillDisappear снова измените barStyle на стиль строки состояния приложения, который в нашем случае .default,

это работает для меня

Работает для навигации на основе конкретного контроллера представления в 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)

Для Xcode 10 вы можете создать класс и поместить его перед вашим классом viewController, вы можете вызвать этот класс во всех контроллерах представления, нужна легкая строка состояния контента...

class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}

Теперь измените ваш класс viewController в:

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

И это все...

Я буквально попал в этот же вопрос. У меня ушло более 4 часов, чтобы понять это. Я перепробовал все ответы, приведенные здесь, и лучшее, что я получил, было получить заголовок строки состояния белого цвета. Но другие биты, такие как батарейный блок и другие, все еще были черными, независимо от того, что я сделал: относительно применения всех решений, представленных в этом вопросе. Поэтому я решил вернуться к своим шагам и узнал, что я загрузил зависимость CocoaPod, которая изменяла обычные функции Xcode и коды для изменения цвета. Для меня это была зависимость "ChameleonFramework". Поэтому я бы посоветовал вам проверить свои зависимости, которые вы установили с CocoaPods, удалив самые последние из них, если вы применили все решения и не работаете на вас.

По состоянию на октябрь 2020 г., Swift 5, Xcode 12

Если вы хотите установить его для всех контроллеров представления в приложении. и если в вашем приложении есть контроллер навигации.

Вы можете сделать это в файле plist следующим образом:

Свифт 3

В вашем AppDelegate файл внутри func application метод

let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red

Если кто-то хочет изменить батарею и цвет текста в строке состояния, как на изображении ниже:

вы можете использовать следующий код в классе appdelegate.

UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]

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 }
Другие вопросы по тегам