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

  • Обновление Swift 3 *

    UIApplication.shared.statusBarStyle =.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 плохой, никакого эффекта.

введите описание изображения здесь

  1. В последнее время я получаю его. В моем настраиваемом контроллере навигации 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

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

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

  1. Внесите preferredStatusBarStyle, возвращая ваш предпочтительный тип.

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

Цель C

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

Swift

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

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

Ответ 20

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

  • Измените вид строки состояния на основе контроллера в info.plist на YES.
  • Теперь любой контроллер полного экрана может изменить стиль строки состояния, переопределив preferredStatusBarStyle.
  • Я указываю полноэкранный режим, потому что это не будет работать для (не полноэкранных) контроллеров модального просмотра, не без установки modal​Presentation​Captures​Status​Bar​Appearance в Да, который есть.
  • Кроме того, если у вас встроенные контроллеры представлений, например, например, в контроллере навигации, он попросит контроллер верхнего уровня для стиля строки состояния. Переопределение child​View​Controller​For​Status​Bar​Style и передача встроенного контроллера представления должны работать, но это не для меня. Поэтому я просто вернул выбранную строку статуса встроенных контроллеров представлений как предпочтительный стиль строки состояния. Что-то вроде этого:

    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