Останнє оновлення (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 у двох сценаріях:
- Після ініціалізації екрана, коли готовий інтерфейс користувача.
- Після дзвінка
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")
}
}
}