Как изменить цвет текста статус-бара (Status Bar) в iOS на Swift?
Решение: правильный способ изменить цвет статус-бара в iOS (Swift)
Проблема, с которой вы столкнулись, типична для новичков. Дело в том, что начиная с iOS 7 и особенно в современных версиях (iOS 13+), Apple изменила подход к управлению статус-баром. Раньше можно было глобально задать стиль через UIApplication.shared.statusBarStyle, но теперь это устаревший метод. Правильный путь — использовать свойство preferredStatusBarStyle в вашем ViewController, но с учётом нескольких важных нюансов.
Шаг 1: Настройка Info.plist
Убедитесь, что в файле Info.plist вашего проекта есть ключ:
UIViewControllerBasedStatusBarAppearance = YES
Этот ключ говорит системе, что каждый ViewController сам отвечает за свой статус-бар. Если его нет, добавьте (по умолчанию он должен быть YES, но лучше проверить).
Шаг 2: Переопределение preferredStatusBarStyle в контроллере
В вашем ViewController переопределите свойство:
class ViewController: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent // Белый текст
}
}
Шаг 3: Важный момент — если контроллер встроен в NavigationController
Частая ошибка: если ваш ViewController находится внутри UINavigationController, то preferredStatusBarStyle контроллера игнорируется. Вместо него используется стиль NavigationController. Решение — создать подкласс UINavigationController и переопределить свойство там:
class CustomNavigationController: UINavigationController {
override var preferredStatusBarStyle: UIStatusBarStyle {
// Возвращаем стиль верхнего контроллера
return topViewController?.preferredStatusBarStyle ?? .default
}
}
Затем в сториборде или в коде используйте CustomNavigationController вместо стандартного.
Шаг 4: Если используете TabBarController
Аналогичная ситуация с UITabBarController. Создайте подкласс:
class CustomTabBarController: UITabBarController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return selectedViewController?.preferredStatusBarStyle ?? .default
}
}
Шаг 5: Принудительное обновление статус-бара
Если вы меняете стиль динамически (например, при смене темы), вызовите:
setNeedsStatusBarAppearanceUpdate()
Это заставит систему переспросить preferredStatusBarStyle у контроллера.
Полный пример для простого случая (без NavigationController)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .black // Тёмный фон
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
Что делать, если ничего не помогает?
- Проверьте, что ваш ViewController — это корневой контроллер окна (или первый в иерархии).
- Убедитесь, что в Info.plist нет ключа
UIStatusBarStyle(он может переопределять настройки). - Перезапустите симулятор или устройство — иногда изменения не применяются из-за кэша.
Теперь ваш статус-бар будет белым на тёмном фоне!
<<Альтернативный подход: глобальная настройка через UIScene (iOS 13+)
Если ваше приложение использует UISceneDelegate (что стандартно для новых проектов в Xcode), вы можете задать стиль статус-бара глобально в методе scene(_:willConnectTo:options:) вашего SceneDelegate:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// Устанавливаем статус-бар для всего окна
if let window = windowScene.windows.first {
window.overrideUserInterfaceStyle = .dark // Тёмная тема
}
}
Этот метод автоматически подстраивает статус-бар под тёмную тему (белый текст). Если вам нужен светлый статус-бар на светлом фоне, используйте .light.
Обратите внимание: этот подход работает только если в Info.plist установлено UIViewControllerBasedStatusBarAppearance = NO. Однако я рекомендую использовать первый метод (через контроллеры), так как он даёт больше гибкости для разных экранов приложения.
Ответов пока нет.
Войдите чтобы оставить ответ