Avatar ·

Как изменить цвет текста статус-бара (Status Bar) в iOS на Swift?

Всем привет! Я новичок в iOS-разработке на Swift, и у меня возникла проблема с изменением цвета текста в статус-баре (верхняя панель с временем, батареей и т.д.). Мне нужно, чтобы текст был белым, так как фон моего приложения тёмный, и стандартный чёрный текст просто не виден. Я перепробовал несколько способов, но ни один не сработал. Вот что я пробовал: 1. В Info.plist добавил ключ `UIViewControllerBasedStatusBarAppearance` и установил его в `NO`. 2. В AppDelegate в методе `application(_:didFinishLaunchingWithOptions:)` написал: ```swift UIApplication.shared.statusBarStyle = .lightContent ``` Но это не работает — Xcode выдаёт предупреждение, что `statusBarStyle` устарел в iOS 13. 3. Затем я попробовал переопределить метод в своём ViewController: ```swift override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } ``` Но даже это не помогло — статус-бар всё равно остаётся тёмным. Может быть, я что-то упускаю? Использую Xcode 15, iOS 17. Подскажите, как правильно изменить цвет текста статус-бара в современном 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. Однако я рекомендую использовать первый метод (через контроллеры), так как он даёт больше гибкости для разных экранов приложения.