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

193
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 ?

Ануй
источник

Ответы:

349

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

Первый шаг:

Откройте ваш info.plist и вставьте новый ключ с именем « Показать внешний вид строки состояния на основе контроллера », чтобы НЕТ

Второй шаг (просто объяснение, нет необходимости реализовывать это):

Обычно мы помещаем следующий код в приложение (_: didFinishLaunchingWithOptions :) метод AppDelegate,

Swift 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Swift 3

UIApplication.shared.statusBarStyle = .lightContent

но это влияет на statusBarStyleвсе ViewControllers.

Итак, как заставить это работать для определенных ViewControllers - последний шаг:

Откройте файл 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

Ануй
источник
4
Обратите внимание, что если вы установите Status bar is initially hidden = YESв файле info.plist, «Просмотр строки состояния на основе контроллера = НЕТ» вызовет скрытие строки состояния.
xi.lin
13
Если вы снова переключаетесь на UIStatusBarStyle.Defaultиспользование viewWillDisappear(), вам следует использовать его viewWillAppear()для инициализации, а не viewDidLoad().... в противном случае, если вы вернетесь к этому представлению без необходимости его повторной загрузки, вы не увидите StatusBarStyleожидаемого.
William GP
7
Для Свифта 3: UIApplication.shared.statusBarStyle = .lightContent
Ибрагимильмаз
4
До сих пор не ясно, как вы меняете цвет строки состояния
DoruChidean
4
Ребята, это устарело с iOS 9
byJeevan
109

(По состоянию на 20 сентября 2019 г.)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}
BennyTheNerd
источник
7
Обязательно позвоните, super.viewWillAppearесли копируете и вставляете этот код
Стивен Силбер
Отредактировано, чтобы включить super.viewWillAppear (). Спасибо @StephenSilber за совет!
BennyTheNerd
Вы должны переопределить предпочитаемый класс StatusStyle, иначе он не будет работать. Спасибо что подметил это. +1
Аликс
3
Использование UIApplication.shared.statusBarStyle = .lightContentрезультатов в этом предупреждении компилятора: Сеттер для 'statusBarStyle' устарел в iOS 9.0: Использование - [UIViewController предпочитаемыйStatusBarStyle]
airowe
3
В Info.plist вашего приложения установите для «Просмотр внешнего вида строки состояния на основе контроллера» значение YES
IvanPavliuk
31

Решение Swift 4.2 с NavigationController

Первый шаг:

Откройте info.plist и вставить новый ключ с именем « View на базе контроллера в строке состояния внешний вид » или UIViewControllerBasedStatusBarAppearanceна YES , чтобы позволить каждому VC использовать свое собственное свойство статуса.

Второй шаг

В каждом VC переопределите свойство предпочитаемое свойство StatusBarStyle следующим образом:

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
}
guillama
источник
Это только способ достижения ожидаемого результата с помощью Navigation Controller и ваших собственных контроллеров. Также вы можете сделать это для prefersStatusBarHidden, как я делал для своего проекта :)
atereshkov
29

Я следовал этому уроку, и он работал для меня. Однако я не уверен, есть ли какие-либо предостережения.

https://coderwall.com/p/dyqrfa/customize-navigation-bar-appearance-with-swift

  • Откройте ваш info.plist и установите UIViewControllerBasedStatusBarAppearanceдля false.
  • В первой функции AppDelegate.swift, которая содержит didFinishLaunchingWithOptions, установите нужный вам цвет.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

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

    UIApplication.shared.statusBarStyle = .lightContent

chris_s
источник
11
как это специфично для каждого контроллера представления
Ярнео
4
Точно, это для полного приложения, и это не вопрос.
Anuj
3
Я использую iOS 8 Swift и xCode 6.1.1 и просто выполнить эти два шага не получится. Вам также нужно добавить UIApplication.sharedApplication().statusBarHidden = falseв AppDelegate.swift didFinishLauchingWithOptions
Ахмад Амин
Это установлено для всего приложения. Для конкретных контроллеров представления см. Первый ответ. Это сработало для меня.
Акшар Патель
Установщик для statusBarStyle устарел в iOS 9.0: Использование - [UIViewController предпочитаемыйStatusBarStyle]
Александр
22

Здесь миллиард ответов, поэтому я подумал, почему бы не добавить еще одно в виде расширения (с помощью @ 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
Джон Р Перри
источник
2
Обратите внимание, что такой подход может рассматриваться как доступ к частному API и может означать, что ваше приложение будет отклонено Apple.
JWhitey
Или, по крайней мере, это зависит от деталей реализации Apple и может сломаться без предупреждения с изменениями в iOS.
Крис Принс
19

В вашем Info.plist вы должны определить любое отображение вида строки состояния на основе контроллера.

Если вы определите его как YES, вам следует переопределить функцию предпочитаемое значение StatusBarStyle в каждом контроллере представления.

Если вы определите это НЕТ, тогда вы можете установить стиль в AppDelegate, используя

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
Никита Хандельвал
источник
7
setStatusBarStyleустарела в iOS 9.0
Джеффри Нео
@Jeffrey_Neo Хотя это правда, я не могу заставить замену работать. Было бы полезно увидеть ваш комментарий как ответ с рабочим кодом.
Дамблдад
15
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()
    }

}
AG
источник
использование valueForKey("statusBar")может не соответствовать рекомендациям Apple
Cœur
15

Swift 3

let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
  statusBar.backgroundColor = UIColor.black
} 

Это решение для установки цвета фона строки состояния для конкретного контроллера представления.

Крис Цицарис
источник
3
UIView всегда реагирует на backgroundColor в Swift.
Cœur
13

SWIFT 2

Мне удалось успешно изменить внешний вид фона строки состояния, добавив в свой viewWillAppear следующее:

let statusBar: UIView = UIApplication.sharedApplication().valueForKey("statusBar") as! UIView

    if statusBar.respondsToSelector(Selector("setBackgroundColor:")) {
        statusBar.backgroundColor = .redColor()
    }
Эй Джей Эрнандес
источник
10

Реализовать preferredStatusBarStyleкак вы упомянули , и вызов self.setNeedsStatusBarAppearanceUpdate()в , ViewDidLoadа также в Info.plist наборе UIViewControllerBasedStatusBarAppearanceк YES(это YESпо умолчанию)

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

codester
источник
Просто выполнение первой части ответа, сработало для меня. Однако я не добавил UIViewcontrollerBasedStatusBarAppearance в Info.plist. Это все еще работало.
Акшар Патель
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
    }
Жанг
источник
1
Я попробовал все решения ... это работало только для меня! Я не знаю почему: D
Халед Хайек
удача ничьей
Гианг
Сеттер для isStatusBarHidden устарел в iOS 9.0: Использование - [UIViewController предпочитает StatusBarHidden] ...
drew ..
9

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

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

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

StarsView Controller является CPBaseNavigationControllerи CPBaseNavigationControllerявляется подклассом UINavigationController.

Я пытаюсь сделать следующие шаги:

  1. В AppDelegate.swiftfunc didFinishLaunchingWithOptionsдобавить

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

    но без эффекта.

  2. В StoryBoard найдите Base Tab BarController(рисунок выше). Выберите Attributes Inspector, изменитеSattus Bar атрибут на Light Content.so bad, без эффекта.

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

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

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

    Это работает хорошо!

Кроме того, statusBarStyleустарела в 9.0, вы можете использовать-[UIViewController preferredStatusBarStyle] .

wenghengcong
источник
9

Работает для навигационных приложений

    var addStatusBar = UIView()
    addStatusBar.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 20);
    addStatusBar.backgroundColor = global().UIColorFromRGB(0x65b4d9)
    self.window?.rootViewController?.view .addSubview(addStatusBar)
Jio
источник
Куда добавить этот конкретный код, просто не могу заставить это работать.
Anuj
U может добавить его в файл делегата приложения в didFinishLaunchingWithOptions
Jio
1
Не лучше ли использовать addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) вместо жестко заданной ширины 320?
Торстен Оджаперв
Edited @TorstenOjaperv
Jio
Как это сделать с помощью swift 3.0?
YETI
8

Все гораздо проще в 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)
Антон Россия
источник
1
Значения красного, зеленого и синего находятся в диапазоне от 0 до 1. Вы должны разделить их на 255, иначе это не сработает.
Makalele
8

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
    }
}
краб
источник
7

Swift 4 Для определенного ViewController без встроенной навигации ViewViewController просто добавьте это в свой файл ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}
Сурджит Сингх
источник
Если у нас есть встроенный навигационный контроллер, что вы делаете?
icekomo
7

Еще один действительно простой способ сделать это - просто создать расширение класса UINavigationController.

Поскольку переопределение preferredStatusBarStyle:метода не будет работать UNLESS, мы делаем это внутри класса UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }
azemi
источник
4

Я установил определенный цвет (в формате 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файл:

Просмотр внешнего вида строки состояния контроллера с логическим значением, установленным на NO

Снимок экрана 1

Снимок экрана 2

Джайпракаш Дубей
источник
С Siwft 3.0, как это сделать?
YETI
4

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

  1. Просто вызовите setNeedsStatusBarAppearanceUpdate в viewDidLoad, как сказано в документации Apple,

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

  1. Реализуйте предпочитаемый тип StatusBarStyle, возвращающий предпочитаемый вами тип.

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

Цель С

[self setNeedsStatusBarAppearanceUpdate];

-(UIStatusBarStyle)preferredStatusBarStyle {
     return UIStatusBarStyleLightContent;
}

стриж

setNeedsStatusBarAppearanceUpdate()

var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent
}

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

Бхаумик Десаи
источник
4

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

  1. Измените внешний вид строки состояния на основе контроллера info.plistна YES.
  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
    }
Джон С.
источник
Этот ответ помог мне! Я обнаружил, что по какой-то причине мой навигационный контроллер (представленный модально) неявно не запрашивал самый верхний контроллер представления для его стиля строки состояния. Поэтому я должен был создать подкласс UINavigationControllerи переопределить child​View​Controller​For​Status​Bar​Styleпеременную там, вернувшись self.topViewController.
Табер
3

В Swift 4 или 4.2

Вы можете добавить на свой вк

preferredStatusBarStyle

и установите возвращаемое значение

.lightContent или .default

например:

override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
}
Ридо Октанио
источник
3

(По состоянию на 10 июня 2020 г.)

Swift 5 ( без редактирования .Plistфайла )

Если вы используете Storyboard, перейдите к NavigationController, выберите navigationBar, нажмите на Attributes Inspector, затем измените style. если вам нужно light content( белая строка состояния ), установите все, кроме, defaultскажем, установки стиля. blackА если хотите dark content ( черная строка состояния ), установите его default.

Значение по умолчанию ( UIBarStyleDefault) приводит к темной UIStatusBarStyleDefaultстроке состояния переднего плана . И UIBarStyleBlackдаст UIStatusBarStyleLightContentстатус бар.

Programatically

let nav = UINavigationController(rootViewController: rootViewController)

    nav.navigationBar.barStyle = .default //gives you dark Content status bar

    nav.navigationBar.barStyle = .black  //gives you light content status bar

Без панели навигации ( Правка.Plist )

добавить UIViewControllerBasedStatusBarAppearance/ View controller-based status bar appearanceк вашему info.plist, и установить значение true.

OverridepreferredStatusBarStyleсвойство в вашем контроллере

class ViewController: UIViewController {
    override var preferredStatusBarStyle : UIStatusBarStyle {
        return .lightContent
    }
}
jawadAli
источник
2

Обновление Swift 3.0

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }
Jaseibert
источник
2

Что работало со мной, в раскадровке перейдите к контроллеру навигации, выберите панель навигации, нажмите инспектор атрибутов, затем измените стиль с по умолчанию на черный. Это оно!

Amr
источник
2

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. Ссылка здесь: таинственный случай строки состояния

Эрик Уэке
источник
1

Нажмите на группу «Файлы поддержки» (слева вверху - название вашего проекта). Перейдите к информации. Нажмите на + где-то между списками, как показано ниже названия пакета. Добавьте «Просмотр внешнего вида строки состояния на основе контроллера» и установите для него значение «НЕТ». Затем откройте AppDelegate.swift и измените его следующим образом:

func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {

UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

return true
}

Это оно.

Горан Яковлевич
источник
Вы неправильно прочитали вопрос. Я спросил о том, как изменить StatusBarStyle для определенных контроллеров представления, а не для полного приложения.
Anuj
Проверьте мой ответ ниже @Anuj
theCrab
1

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

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

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

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

И это все...

Fabio
источник
1

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

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


Сеттер для 'statusBarStyle' устарел в iOS 9.0: Использование - [UIViewControlleradvanStatusBarStyle]

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.

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

Хешам Галааб
источник
1

Пользовательский цвет для строки состояния (iOS11 +, Swift4 +)

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

let statusBarView = UIView()
view.addSubview(statusBarView)
statusBarView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    statusBarView.topAnchor.constraint(equalTo: view.topAnchor),
    statusBarView.leftAnchor.constraint(equalTo: view.leftAnchor),
    statusBarView.rightAnchor.constraint(equalTo: view.rightAnchor),
    statusBarView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor)
])
statusBarView.backgroundColor = .blue
Тунг Фам
источник