Зміна кольору рядка стану для конкретних ViewControllers за допомогою Swift в iOS8


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

Відповіді:


350

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

Перший крок:

Відкрийте свій info.plist і вставте нову клавішу під назвою " Перегляд зовнішнього вигляду на основі контролера " на " НІ"

Другий крок (лише пояснення, не потрібно цього втілювати):

Зазвичай ми ставимо наступний код у програму (_: didFinishLaunchingWithOptions :) методу AppDelegate,

Швидкий 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Швидкий 3

UIApplication.shared.statusBarStyle = .lightContent

але це впливає на statusBarStyleвсі ViewControllers.

Отже, як змусити це працювати для конкретних ViewControllers - заключний крок:

Відкрийте файл перегляду контролера, де ви хочете змінити, statusBarStyleі введіть такий код viewWillAppear(),

Швидкий 2

UIApplication.sharedApplication().statusBarStyle = .LightContent

Швидкий 3

UIApplication.shared.statusBarStyle = .lightContent

Крім того, viewWillDisappear()реалізуйте метод для цього конкретного viewController і введіть наступні рядки коду,

Швидкий 2

override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.Default

}

Швидкий 3

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = UIStatusBarStyle.default
}

Цей крок спочатку змінить значення statusBarStyleдля конкретного контролера перегляду, а потім змінить його назад, defaultколи певний контролер перегляду зникне. Нереалізація 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
відJeevan

109

(Станом на 20 вересня 2019 року)

Swift 5 , Swift 4.2 , Swift 4

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
    .lightContent
}

7
Обов’язково зателефонуйте, super.viewWillAppearякщо ви копіюєте та вставляєте цей код
Стівен Сілбер

Відредаговано до включеного super.viewWillAppear (). Дякую @StephenSilber за пораду!
BennyTheNerd

вам доведеться перекрити бажанийStatusStyle, інакше він не працюватиме. дякую, що вказали на це. +1
Алікс

3
Використання UIApplication.shared.statusBarStyle = .lightContentрезультатів у цьому попередженні компілятора: Установник для 'statusBarStyle' був устарений у iOS 9.0: Використання - [UIViewController preferenceStatusBarStyle]
airowe

3
У інформаційному списку вашої програми встановіть "Перегляд зовнішнього вигляду рядка стану контролера" на ТАК
ІванПавлюк

29

Я дотримувався цього підручника, і він працював на мене. Однак я не впевнений, чи є якісь застереження.

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

  • Відкрийте свій інформаційний список і встановіть UIViewControllerBasedStatusBarAppearanceна false.
  • У першій функції в AppDelegate.swift, яка містить didFinishLaunchingWithOptions, встановіть потрібний колір.

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

  • Оновлення Swift 3 *

    UIApplication.shared.statusBarStyle = .lightContent


11
як це характерно для кожного контролера перегляду
Ярнео

4
Саме це і є для повного додатка, і це не питання.
Ануй

3
Я використовую iOS 8 Swift та xCode 6.1.1, і лише наступні два кроки не працюють. Вам також потрібно додати UIApplication.sharedApplication().statusBarHidden = falseдо AppDelegate.swift didFinishLauchingWithOptions
Ахмад Амін

Це встановило його для всієї програми. Конкретні контролери перегляду див. Першу відповідь. Це працювало для мене.
Акшар Патель

В iOS 9.0 встановлено налаштування для "statusBarStyle": Використовувати - [UIViewController preferenceStatusBarStyle]
Олександр

29

Рішення Swift 4.2 з NavigationController

Перший крок:

Відкрийте info.plist і вставити новий ключ з ім'ям « View на базі контролера в рядку стану зовнішній вигляд » або UIViewControllerBasedStatusBarAppearanceна YES , щоб дозволити кожному VC використовувати своє власне властивість статусу.

Другий крок

У кожному VC замініть перевагу властивостіStatusBarStyle, як це:

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent //.default for black style
}

Останній крок

Замініть перевагу властивостіStatusBarStyle у вашому користувальницькому класі 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
}

Це лише спосіб досягнення очікуваного результату за допомогою навігаційного контролера та власних контролерів. Також ви можете зробити цей спосіб для prefersStatusBarHidden, як я зробив для свого проекту :)
atereshkov

22

Тут є мільярд відповідей, тому я подумав, чому б не додати ще одну у вигляді розширення (за допомогою @ Cœur)

Швидкий 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 потрібно визначити зовнішній вигляд рядка стану на основі контролера до будь-якого значення.

Якщо ви визначите це так, то вам слід перекрити перевагу функціїSystemusBarStyle у кожному контролері подання.

Якщо ви визначите його НІ, ви можете встановити стиль у AppDelegate за допомогою

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

7
setStatusBarStyleбув застарілий в iOS 9.0
Jeffrey Neo

@Jeffrey_Neo Хоча це правда, я не можу заставити заміну працювати. Було б корисно побачити ваш коментар як відповідь з робочим кодом.
dumbledad

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

}

використання valueForKey("statusBar")може не відповідати керівництву Apple
Cœur

15

Швидкий 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

Мені вдалося змінити зовнішній вигляд фону рядка стану, додавши в моє переглядWillAppear:

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.


Тільки реалізуючи першу частину відповіді, працював на мене. Однак я не додав 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
Халед Хайєк

везіння жеребкування
Джан

В iOS 9.0 встановлено програму "isStatusBarHidden": Використовувати - [UIViewController віддає перевагуStatusBarHidden] ...
звернуто ..

9

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

Ви можете побачити на малюнку нижче.

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

StarsКонтролер перегляду є CPBaseNavigationControllerі CPBaseNavigationControllerє підкласомUINavigationController .

Я намагаюся робити наступні дії:

  1. У AppDelegate.swiftфункції didFinishLaunchingWithOptions, додайте

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

    але ефекту немає.

  2. У StoryBoard знайдіть Base Tab BarController(малюнок вище) .select Attributes Inspector, змініть Sattus Barатрибут на Light Content.so bad, no ефект.

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

  1. Останнє я отримую. У мій користувацький контролер навігації CPBaseNavigationControllerдодайте функцpreferredStatusBarStyle

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

    Це добре працює!

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


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)

Де додати цей специфічний код, просто не вдалося змусити це працювати.
Ануй

Ви можете додати його у файл-делегат програми в didFinishLaunchingWithOptions
Jio

1
Чи не було б краще використовувати addStatusBar.frame = CGRectMake (0, 0, UIScreen.mainScreen (). Bounds.width, 20) замість жорстко закодованої ширини 320?
Торстен Ояперв

Відредаговано @TorstenOjaperv
Jio

Як це зробити з швидким 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, інакше це не працюватиме.
Макалеле

8

Швидкий 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 без вбудованої навігаціїViewController просто додайте це у файл ViewController.

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Якщо у нас вбудований навігаційний контролер, що ви робите?
icekomo

7

Ще один дійсно простий спосіб зробити цю роботу - просто створити розширення класу UINavigationController.

Оскільки preferredStatusBarStyle:метод, який перебуває над принципом, не працює БЕЗКОШТОВНО, ми робимо це всередині класу UINavigationController.

    extension UINavigationController {
        open override var preferredStatusBarStyle: UIStatusBarStyle {
            return .lightContent
        }
    }

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 файлі:

Перегляньте зовнішній вигляд рядка стану на основі контролера із булевим значенням, встановленим на НІ

Знімок екрана 1

Знімок екрана 2


Як це зробити з Siwft 3.0?
YETI

4

Я можу запропонувати вам більш простий спосіб,

  1. Просто зателефонуйте setNeedsStatusBarAppearanceUpdate у viewDidLoad, як кажуть документи Apple,

Зателефонуйте цьому методу, якщо змінюються атрибути панелі стану контролера перегляду, такі як прихований / неприхований статус чи стиль. Якщо ви викликаєте цей метод у межах анімаційного блоку, зміни анімовуються разом з рештою блоку анімації.

  1. Реалізація preferenceStatusBarStyle, повертаючи бажаний тип.

Він працював для мене в iOS 10.1.

Мета C

[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

Ви можете додати на свій відеокарт

переважніStatusBarStyle

і встановити значення повернення до

.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 смугу статусу.

Програматично

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

2

Швидке оновлення 3.0

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

        UIApplication.shared.statusBarStyle = .lightContent

        return true
    }

2

Що працювало зі мною, на Дошці розкадрувань перейдіть до Контролера навігації, виберіть панель навігації, натисніть на інспектор атрибутів, а потім змініть стиль з типового на чорний. Це воно!


2

SWIFT 4.2 Гей, я хотів поділитися рішенням, яке спрацювало на мене, і я отримав чудову статтю з цієї грандіозної теми від Graig Grummitt.

Крок 1. Як інші згадали ДОБАВИТИ нижче до вашого ПЛІСТа

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. У моїй ситуації мені довелося оновити ці властивості для контролера перегляду контейнерів, який був батьківською частиною видимого контролера догляду дітей. Я зробив це за допомогою простого методу делегата.

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)

Як було сказано вище, Graig Grummitt детальніше розглядає це рішення, а також працює з UINavigationControllers також. Посилання тут: Загадковий випадок рядка стану


1

Клацніть на групу "Підтримуючі файли" (зліва вгорі - назва вашого проекту). Перейдіть до інформації. Клацніть на + десь між списками, як-от нижче назви пакета. І додайте "Перегляд зовнішнього вигляду рядка стану на основі контролера" та встановіть його на "НІ". Потім відкрийте AppDelegate.swift і змініть так:

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

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

return true
}

Це воно.


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

Перевірте мою відповідь нижче @Anuj
theCrab

1

Для Xcode 10 ви можете створити клас і поставити його перед вашим класом viewController, ви можете викликати цей клас у всіх контролерах перегляду, потрібна світла смуга стану вмісту ...

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

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

class YourViewController: UIViewControllerWithLightStatusBar {
...
}

І це все ...


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

УВАГА


В iOS 9.0 встановлений програму "statusBarStyle" був застарілий: Використовуйте - [UIViewController preferenceStatusBarStyle]

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 таким барвим стилем, він буде приймати .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.