Як встановити стиль рядка стану в Swift 3


186

Я використовую Xcode 8.0 beta 4.

У попередній версії UIViewController було встановлено стиль рядка стану

public func preferredStatusBarStyle() -> UIStatusBarStyle

Однак я виявив, що це змінилося на "Отримати ТІЛЬКУ змінну" в Swift 3

public var preferredStatusBarStyle: UIStatusBarStyle { get } 

Як надати стиль для використання в моєму UIViewController?


спробуйте цей варіалStatusBarStyle: UIStatusBarStyle = .lightContent
Anbu.Karthik

Відповіді:


485

[ОНОВЛЕНО] Для Xcode 10+ та Swift 4.2+

Це кращий метод для iOS 7 та новіших версій

У програмі Info.plistвстановлено View controller-based status bar appearanceзначення YES.

Замініть preferredStatusBarStyle ( Документи Apple ) у кожному з ваших контролерів перегляду. Наприклад:

override var preferredStatusBarStyle: UIStatusBarStyle {     
      return .lightContent
}

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

iOS до версії 7, застарілий метод

Apple це застаріло , тому воно буде видалено в майбутньому. Використовуйте вищевказаний метод, щоб вам не довелося переписувати його, коли виходить наступна версія iOS.

Якщо ваша програма підтримуватиме в програмі Info.plist, встановіть View controller-based status bar appearanceзначення NO.

В appDelegate.swift, в didFinishLaunchingWithOptionsфункції, додайте:

UIApplication.shared.statusBarStyle = .lightContent

Для навігаційного контролера

Якщо ви користуєтесь контролером навігації та хочете, View controller-based status bar appearanceщоб YESу вашому додатку використовувався та встановлювався бажаний стиль рядка стану кожного контролера переглядуinfo.plist

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

3
Працює для мене. Забули спочатку вставити нове налаштування в Info.plist.
фальсекріпт

1
@LightMan статус uiapplicationBarStyle не застарілий, я використовував це в iOS 11 і він працює.
Сушобхіт

1
@Sushobhit setStatusBarStyle був застарілий у iOS 9, як використовується у цій відповіді. Але у вас все ще є властивість UIApplication.statusBarStyle як властивість лише для читання.
LightMan

1
Бувають випадки, коли ви хочете мати можливість встановити це програмно через колір кожного перегляду.
Алехандро Кавазос

9
Ви також можете видалити рядок у appDelegate.swift та перейти до Цільової -> Загальна -> Інформація про розгортання -> Стиль
рядка

162

Останнє оновлення (Xcode 10+ / Swift 4.2+)

Ця стаття залишається недоторканою для тих, хто бажає зрозуміти логіку різних підходів, що існували протягом останніх кількох років. Тим часом, з Xcode 10, перший підхід Swift 4.2 застарілий і більше не підтримується (тобто не набере чинності, якщо ви спробуєте його використовувати). Все ще надсилається ваша інформація, щоб краще зрозуміти міркування за Plist.infoпрапором та налаштування практики.

Важливе уточнення

Дуже важливо зрозуміти два підходи до налаштування зовнішнього вигляду рядка стану. Вони різні і їх не слід змішувати.

Перший підхід - один колір для цілого додатка (ВИДАЛЕНО з iOS7)

У info.plist ви знаходите або створюєте ключ, який називається

View controller-based status bar appearance

і встановіть його на НІ .

Що це робить? Він по суті встановлює параметр, який говорить про те, що у вашій програмі зовнішній вигляд рядка стану не визначається індивідуально кожним контролером перегляду . Це дуже важливо, щоб зрозуміти. Це означає, що у вас є однакові налаштування для всього додатка, для всіх екранів. Є два параметри: defaultце чорний текст на білому тлі, або lightContentбілий текст на чорному тлі.

Щоб встановити один із них ( одна настройка для всіх екранів ):

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent // .default
    return true
}

Таким чином, вам не потрібно буде встановлювати це налаштування на кожному контролері перегляду. Однак завжди можна вдатися до цього методу, щоб добровільно змінити зовнішність.

Другий підхід - індивідуальний колір для кожного контролера перегляду

Це навпаки. Щоб він працював, перейдіть до info.plist і встановіть

View controller-based status bar appearance

до ТАК

Таким чином, кожен раз, коли відкрито новий контролер перегляду, стиль рядка стану встановлюється індивідуально, якщо ви вставляєте цю реалізацію у кожному UIViewControllerнеобхідному випадку:

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

У вас є те саме, що і в першому, встановіть темний або світлий стиль для панелі стану, індивідуального для кожного контролера перегляду.

Цю властивість отримує UIKit у двох сценаріях:

  1. Після ініціалізації екрана, коли готовий інтерфейс користувача.
  2. Після дзвінка setNeedsStatusBarAppearanceUpdate()в код.

В останньому випадку ви можете маніпулювати зовнішнім виглядом смужки стану за допомогою наступного коду:

var isDark = false {
    didSet {
        setNeedsStatusBarAppearanceUpdate()
    }
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return isDark ? .lightContent : .default
}

func toggleAppearance() {
   isDark.toggle()
}

Потім, коли ви телефонуєте toggleAppearance() , зміни стилю панелі стану буде спровоковано.

Третій підхід - Хак!

Існує хак, який дозволяє безпосередньо отримувати доступ до панелі стану:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
        statusBar.backgroundColor = UIColor.blue
    }
    
    return true
}

Навіщо рубати? Якщо вам потрібен колір рядка стану, відмінний від чорного або білого, ви використовуєте незадокументований API. Ви отримуєте statusBarоб'єкт за допомогою KVC і встановлюєте його колір тла. Об'єкт, який ви отримуєте таким чином, це те UIStatusBar, що походить від UIViewі, таким чином, природно підтримує backgroundColorвластивість. Це брудний, не законний спосіб, але поки це єдиний спосіб налаштувати спеціальний колір для UINavigationBarпанелі статусу (не враховуючи підходу, який дозволяє повністю налаштувати зовнішній вигляд панелі статусу). Це може призвести до відхилення вашої програми. Але, можливо, вам пощастило. І якщо ви перебуваєте в певних складних обставинах (наприклад, ієрархія вкладених, дочірньої навігації та контролерів перегляду), це може бути майже єдиним або, принаймні, менш клопітким способом налаштувати зовнішній вигляд панелі стану (наприклад, зробити його прозорим)

Xcode 10+, Swift 4.2

Альтернативи вже немає: розробник повинен дозволити кожному контролеру перегляду визначати зовнішній вигляд панелі стану, встановивши прапор YES (або пропустивши цю дію, оскільки це за замовчуванням ТАК) та дотримуючись вищевказаних інструкцій.


Бонус

Рішення на основі хака, яке ви можете (хоча і не рекомендується) використовувати в складних обставинах, щоб добровільно змінити зовнішній вигляд смужки стану на будь-якій стадії. Наступний метод розширення, кольоровий, робить саме те, що можна було зробити при регулярному підході. Ви можете налаштувати його під свої потреби.

extension UIViewController {
    func setStatusBarStyle(_ style: UIStatusBarStyle) {
        if let statusBar = UIApplication.shared.value(forKey: "statusBar") as? UIView {
            statusBar.backgroundColor = style == .lightContent ? UIColor.black : .white
            statusBar.setValue(style == .lightContent ? UIColor.white : .black, forKey: "foregroundColor")
        }
    }
}

2
Щойно у вас є рядок стану, ви також можете це зробити: statusBar.setValue (UIColor.red, forKey: "foregroundColor"); або скористайтеся будь-яким наявним ключем, щоб встановити будь-яку властивість, доступну для UIStatusBar, але не для UIView
Марк

application.statusBarStyle = .lightContent цей підхід, як правило, оскільки iOS9> Setter для 'statusBarStyle' був устарений у iOS 9.0: Використовуйте - [UIViewController preferenceStatusBarStyle] очікування для UIViewController
токсикус

Це єдине, що працює тут під час зміни кольорової теми програми. Однак, здається, щойно це встановлено, вам завжди доведеться скинути його під час перемикання контролерів перегляду. Відтепер переважний методStatusBarStyle () ігнорується (навіть при правильному налаштуванні в info.plist).
нетоматичний

2
Ця відповідь є більш описовою порівняно з іншими.
ViruMax


130

Ви можете спробувати замінити повернене значення, а не встановлювати його. Метод оголошено як {get}, тому просто надайте добувача:

 override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Якщо ви встановите це умовно, вам потрібно буде зателефонувати, setNeedsStatusBarAppearanceUpdate()щоб він оживив зміни, коли ви будете готові


2
Це кращий підхід, оскільки ви можете вибрати prefersStatusBarHiddenдля деяких своїх поглядів. Якщо ви їдете з UIApplication.shared.statusBarStyleвами, ви будете застрявати в цьому.
superarts.org

105

Swift 3 і 4, iOS 10 і 11, Xcode 9 і 10
Для мене цей метод не працює:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

коли я звик до кожного контролера перегляду, але це спрацювало:

  • У файл info.list додайте рядок: View controller-based status bar appearanceта встановіть уNO

  • Далі в додатку:

    UIApplication.shared.statusBarStyle = .lightContent

Я намагався лише після додавання коду до делегата програми, але для мене було корисно налаштування списку інформації. Дякую
Ахілеш Шарма

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

33

Якщо ви хочете змінити statusBarколір білого на білий, для всіх переглядів, що містяться в UINavigationController, додайте це всередину AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .blackOpaque
    return true
}

Цей код:

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

НЕ працює на UIViewControllersщо міститься в UINavigationController, так як зовнішній вигляд компілятора для statusBarStyleз UINavigationController, не для statusBarStyleзViewControllers містяться нього.

Сподіваюся, це допоможе тим, хто не досяг успіху з прийнятою відповіддю!


Так, велике спасибі! Навігаційний контролер був невеликим нюансом, який багато хто не врахував!
Алексіс Канделарія

26

Якщо ви хочете змінити стиль рядка стану в будь-який час після появи перегляду, ви можете скористатися цим:

  • У файл info.list додайте рядок: Перегляньте зовнішній вигляд рядка стану на основі контролера та встановіть його ТАК

    var viewIsDark = Bool()
    
    func makeViewDark() {
    
        viewIsDark = true
        setNeedsStatusBarAppearanceUpdate()
    }
    
    func makeViewLight() {
    
        viewIsDark = false
        setNeedsStatusBarAppearanceUpdate()
    }
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
    
        if viewIsDark {
            return .lightContent 
        } else {
            return .default 
        } 
    }

1
ІIf you call this method within an animation block, the changes are animated along with the rest of the animation block.
Олександр Г

25

У файл Info.plist потрібно додати нижче:

View controller-based status bar appearance з булевим значенням, встановленим на NO

У вашому класі appdelegate, didFinishLaunchingWithOptionsметодом перед поверненням.

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

зміни backgroundColorта statusBarStyleвідповідно до вимог.


Гарне рішення, але чи вважається це використанням приватного API?
GoldenJoe

Добре працювати, але як я можу змінити свій власний колір?
iSrinivasan27

@MohanSrinivasan замість "UIColor.red" ви можете вказати вам спеціальний колір.
Himanshu padia

25

Xcode 10 або пізнішої версії

Випробуваний у Swift 5

Не потрібен код, просто дотримуйтесь наступних кроків

Якщо ви хочете змінити рядок стану у всьому додатку.

  1. Виберіть Проект з Навігатора проектів (ліва бічна панель).
  2. Виберіть ціль.
  3. Виберіть вкладку Загальні.
  4. Знайти інформацію про розгортання.
  5. Змініть стиль рядка стану на Світлий (для темного фону "Світлий" , Світлий фон "За замовчуванням" )

Не забудьте зміни в інформаційному списку

  1. Виберіть вкладку Інформація
  2. Додайте цей ключ до файлу плістеру "Перегляд зовнішнього вигляду рядка стану на основі контролера" = НІ

Запустіть свій проект і перевірте його.

Мій проект у swift 5 та Xcode 10.2 та 11.0


Для Xcode 10 / Swift5 це повинна бути прийнята відповідь. Для цього потрібно виконати ДВІ кроки.
Джон Робі

Ідеально. Дякую! Я згоден, що це має бути фактично прийнята відповідь.
DungeonDev

Це ідеальна відповідь 🤟🏻
nikhilgohil11

Це повністю працює також для xcode 11 зі швидким 5, спасибі
Луїс Сантьяго

13

Ви також можете це зробити в раскадровці

  1. Створіть новий запис у info.plist "Перегляд зовнішнього вигляду на основі контролера", встановіть його на "ТАК".
  2. Перейдіть до вашої дошки та виберіть навігаційний контролер, який потрібно змінити. Клацніть на панелі навігації у розділі «Контур документа» (ліва панель на аркуші розкадрування)
  3. Перейдіть на праву панель і натисніть розділ атрибутів
  4. У розділі "Навігаційна панель" ви побачите стиль. Виберіть потрібний стиль (за замовчуванням - чорний, а чорний - для білого)

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

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

(Готово з Xcode 8.3.3 у проекті Swift)


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

2
Дуже чистий спосіб встановити стиль рядка стану відповідно до вмісту View Controller. Це правильний спосіб, а не просто налаштування View controller-based status bar appearance = NOта використання лише світлого або темного стилю у всьому додатку. Прикро, що цей "бездетальний" спосіб працює лише в навігаційному контролері, Apple має розглянути можливість додавання іншого поля для встановлення цієї опції в будь-який екземпляр View Controller.
aldoram5

12

Для людей, які хочуть змінити рядок стану для всіх контролерів перегляду на: iOS 11, рішення Swfit 4/5 досить легко.

1) Info.plist додати:

Перегляд вигляду рядка стану на основі контролера -> НІ

2) Ліва сторона проекту XCode slect> Цілі > Виберіть проект> У розділі Загальні> Інформація про розгортання> Виберіть Стиль рядка стану: Світло

Якщо ви хочете змінити рядок стану лише для одного контролера перегляду , у viewDidLoad додайте:

2.1 ) Info.plist

Перегляд вигляду рядка стану на основі контролера -> ТАК

2.2 )

override var preferredStatusBarStyle : UIStatusBarStyle {
    return .lightContent
}

Objective-C (або реагувати на рідну), змінюючи програму Delegate App:

1) Info.plist додати:

Перегляд вигляду рядка стану на основі контролера -> НІ

2) AppDelegate -> didFinishLaunchingWithOptions

[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDarkContent animated:YES];

Змінення рядка стану не працює, намагаючись натиснути (навігаційні контролери), лише на презентації модальних контролерів перегляду.


8

Першим кроком потрібно додати рядок з ключем: View controller-based status bar appearanceта значенням NOу Info.plistфайл. Після цього додайте 2 функції у вашому контролері лише до конкретного, який матиме ефект:

override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       UIApplication.shared.statusBarStyle = .lightContent
}

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

6

Швидкий 3

У Info.plist додайте рядок під назвою "Перегляд зовнішнього вигляду рядка стану на основі контролера" та встановіть його значення No.

class YourViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarStyle = .lightContent //or .default
        setNeedsStatusBarAppearanceUpdate()

    }

}

6

Здається, виникає невелика проблема щодо кольору тексту рядка стану під час роботи з навігаційними смугами.

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

Наприклад:

override func viewWillAppear(_ animated: Bool) {
    let nav = self.navigationController?.navigationBar
    nav?.barTintColor = .red
    nav?.tintColor = .white
    nav?.titleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.white]
    setNeedsStatusBarAppearanceUpdate()
}

і

override var preferredStatusBarStyle: UIStatusBarStyle {return .lightContent}

Наведений вище код не працює, навіть якщо ви встановили в AppDelegate наступне:

UIApplication.shared.statusBarStyle = .lightContent

Для тих, хто все ще бореться, мабуть, це якось судить про те, чи потрібно смужка стану бути світлою або темною за стилями в навігаційній смузі. Отже, мені вдалося виправити це, додавши наступний рядок у viewWillAppear:

nav?.barStyle = UIBarStyle.black

Коли стиль бару чорний, він прослуховує вашу перестановлену змінну. Сподіваюся, це комусь допоможе :)


6

Щоб додати до великого asnwer від @Krunal https://stackoverflow.com/a/49552326/4697535

У разі , якщо ви використовуєте UINavigationController, то preferredStatusBarStyleне матиме ніякого ефекту наUIViewController .

Xcode 10 і Swift 4.

Встановити звичай UINavigationController

Приклад:

class LightNavigationController: UINavigationController {

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

Використовуйте розширення для рішення рівня програми:

extension UINavigationController {

  open override var preferredStatusBarStyle: UIStatusBarStyle {
      guard let index = tabBarController?.selectedIndex else { return .default }
      switch index {
      case 0, 1, 2: return .lightContent // set lightContent for tabs 0-2
      default: return .default // set dark for tab 3
      }
  }
}

5

Xcode 8.3.1, Swift 3.1

  1. Створіть нову запис у info.plist "Перегляд зовнішнього вигляду на основі контролера", встановіть її на "НІ".

  2. Відкрийте AppDelegate.swift і додайте ці рядки в метод "didFinishLaunchingWithOptions":

application.statusBarStyle = .lightContent


5

Швидкий 4+

для білого тексту рядка стану:

navigationController.navigationBar.barStyle = .blackTranslucent

5

Ось рекомендації / інструкції Apple зміни стилю рядка стану.

Якщо ви хочете встановити статус стиль бар, рівень додатків , а потім встановити UIViewControllerBasedStatusBarAppearanceна NOв вашому .plistфайлі. І у вашому appdelegate> didFinishLaunchingWithOptionsдодати наступні ine (програмно ви можете це зробити від делегата програми).

Мета C

[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

Швидкий

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    application.statusBarStyle = .lightContent
    return true
}

якщо ви хочете встановити стиль рядка стану, на рівні контролера перегляду виконайте наступні дії:

  1. Встановіть UIViewControllerBasedStatusBarAppearance для YESв.plist файлі, якщо вам необхідно встановити стиль статус бар тільки на рівні UIViewController.
  2. У функції viewDidLoad add - setNeedsStatusBarAppearanceUpdate

  3. перевизначити перевагуStatusBarStyle у контролері перегляду.

Мета C

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setNeedsStatusBarAppearanceUpdate];
}

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

Швидкий

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Встановіть значення .plist відповідно до рівня налаштування стилю рядка стану.

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


4

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
}

4

iOS 11.2

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UINavigationBar.appearance().barStyle = .black

    return true
}

"blackOpaque" недоступний: Використовуйте UIStatusBarStyleLightContent
Makalele

3

Це працювало для мене

Встановіть View controller-based status barвигляд " НІ" в плісті, а потім UIViewController viewDidAppearпросто додав наступний рядок

UIApplication.shared.setStatusBarStyle(UIStatusBarStyle.lightContent, animated: true)

В iOS 9. застаріла
версія setStatusBarStyle

3

стрімкий 3

якщо Вигляд рядка стану на основі контролера = ТАК у Info.plist

потім використовуйте це розширення для всіх NavigationController

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

якщо немає UINavigationController і маєте лише UIViewController, тоді використовуйте Нижче код:

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

2
Не працює для мене. Я отримую помилки "Властивість не замінює жодну властивість зі свого суперкласу" та "Гетьер для" кращогоStatusBarStyle "із селектором Objective-C" preferenceStatusBarStyle "суперечить попереднім деклараціям із тим самим селектором Objective-C".
Тео

Дякую за це, після 20 різних спроб та декількох комбінацій елементів, щоб спробувати, це спосіб встановити колір рядка стану. Мені просто потрібно було пам'ятати, щоб зателефонувати на setNeedsStatusBarAppearanceUpdate (), коли я хотів змінити колір, оскільки додав його в нічному режимі, а чорний на чорному просто не працював.
Стюарт П.

3

Швидкий 5

Щоб додати більш детальну інформацію щодо відповіді PRAVEEN на https://stackoverflow.com/a/40066798/2082851 , я хотів би надати мою реалізацію. Він підтримує гнучкість для налаштування рядка стану кожного контролера.

В цілому, ми створимо BaseViewControllerручку, яка керуєstatusBarStyle властивістю у всіх випадках. Коли ви створюєте новий контролер, зробіть його як підклас цього базового контролера.

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

Впровадження

class BaseViewController: UIViewController {

    var statusBarStyle: UIStatusBarStyle = .default {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return statusBarStyle
    }
}

Демо

class ViewController: BaseViewController, UIScrollViewDelegate {

    let scrollView = UIScrollView()
    ... 
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        UIView.animate(withDuration: 0.3) {
            if scrollView.contentOffset.y > 30 {
                self.statusBarStyle = .darkContent
            } else {
                self.statusBarStyle = .lightContent
            }
        }
    }
}

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

2. UINavigationController

Для UINavigationController це окремий випадок, за яким ви можете дотримуватися будь-яких рішень:

Рішення A: Переосмислення відправки повідомлень

Оскільки UINavigationController є NSObjectі успадковується ObjectiveC, його методи є, message dispatchі ви можете їх перекрити.

extension UINavigationController {
   open override var preferredStatusBarStyle: UIStatusBarStyle {
      return topViewController?.preferredStatusBarStyle ?? .default
   }
}

Рішення B: Створення UINavigationControllerпідкласу

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

final class NavigationController: UINavigationController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return topViewController?.preferredStatusBarStyle ?? super.preferredStatusBarStyle
    }
}

2

Ви можете використовувати властивість bool з назвою "shouldStatusBarDark", щоб змінити колір рядка стану. Ви також можете оновити його значення, щоб змінити колір рядка стану під час прокрутки.

 var shouldStatusBarDark = false {
     didSet {
         setNeedsStatusBarAppearanceUpdate()
     }
 }

 override var preferredStatusBarStyle: UIStatusBarStyle {
     return shouldStatusBarDark ? .default : .lightContent
 }

 func scrollViewDidScroll(_ scrollView: UIScrollView) {
     let offSetY = scrollView.contentOffset.y
     if offSetY > 50 {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 1
             self.shouldStatusBarDark = true
         })
     } else {
         UIView.animate(withDuration: 0.4, animations: {
             self.navView.alpha = 0
             self.shouldStatusBarDark = false
         })
     }
 }

що таке властивість navView? дякую за те, що ви поділилися своїм рішенням
medskill

1
@medskill NavView - це просто імітаційна панель навігації, додана програмно.
tiantong

2

Більшість цих відповідей повторно прошиті, але жодна з них насправді не стосується екрана запуску для мене при використанні темного фону.

Я обійшов це з наступним в моєму, info.plistякий створив легкий стиль статусної панелі.

<key>UIStatusBarStyle</key>
<string>UIStatusBarStyleLightContent</string>

2

Якщо ви отримуєте попередження: Setter for 'statusBarStyle' був знятий у iOS 9.0: Використовуйте - [UIViewController preferenceStatusBarStyle] , а потім для встановлення смуги стану світлою або темною використовуйте наступний код:

//To set the status bar to white
self.navigationController?.navigationBar.barStyle = .black //or .blackTranslucent

//To set the status bar to black
self.navigationController?.navigationBar.barStyle = .default

Це не змусить ваш navBar змінити це лише вказує на стиль, а отже, відповідно змінює рядок стану.

NB. Вам потрібно переконатися, що ви вказали у своєму інформаційному списку.

View controller-based status bar appearance to YES

2

Якщо ви використовуєте модальну презентацію, вам потрібно встановити:

viewController.modalPresentationCapturesStatusBarAppearance = true

1

В iOS 13 ви можете використовувати .darkContent UIStatusBarStyleвластивість для відображення темної смуги стану


0

Для цілі C просто додайте цей рядок у свій додаток метод didFinishLaunch

UIApplication.sharedApplication.statusBarStyle = UIStatusBarStyleLightContent;

3
Це застаріло з часу iOS 9
MK_Dev

0

за допомогою WebkitView

Swift 9.3 iOS 11.3

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {

    @IBOutlet weak var webView: WKWebView!
    var hideStatusBar = true

    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setNeedsStatusBarAppearanceUpdate()
        let myURL = URL(string: "https://www.apple.com/")
        let myRequest = URLRequest(url: myURL!)
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.red

         webView.load(myRequest)

    }
}

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

3
Швидкий 9.3? Неправильний рік, Marty
iOS Unit

Рекомендую уникати використання приватного API для надмірного "statusBar". Apple щоразу вносить зміни в API! І коли Apple змінить API, ваша програма може вийти з ладу, і вона більше не змінить статус стану. Це змусить вас знову шукати інше рішення.
Doci

0

Якщо ви все ще не можете змінити основу стилю рядка стану в методі

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}

Ви можете спробувати скористатися цим методом:

override viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.navigationBar.barStyle = .black
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.