Avatar ·

Как изменить цвет текста строки состояния (Status Bar) в iOS (Swift)

Всем привет! Я новичок в iOS разработке на Swift и столкнулся с проблемой, которую никак не могу решить. У меня есть приложение с темным фоном на главном экране. Я использую UINavigationController, встроенный через Storyboard. Проблема в том, что строка состояния (Status Bar) отображается черным текстом на темном фоне, и его практически не видно. Мне нужно сделать текст белым. Я пробовал разные способы, но ничего не работает. Вот что я уже перепробовал: 1. В Info.plist добавил `UIViewControllerBasedStatusBarAppearance = NO` и установил `UIStatusBarStyle = UIStatusBarStyleLightContent`. Не помогло. 2. В AppDelegate в методе `application(_:didFinishLaunchingWithOptions:)` написал: ```swift UIApplication.shared.statusBarStyle = .lightContent ``` Но Xcode говорит, что этот метод устарел начиная с iOS 9. 3. Переопределил `preferredStatusBarStyle` в моем ViewController: ```swift override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } ``` Но это тоже не сработало. Я читал, что это может быть связано с UINavigationController, но не понимаю, как это исправить. Мое приложение поддерживает iOS 13+. Подскажите, пожалуйста, как правильно изменить цвет текста Status Bar в современных версиях iOS? Пример кода приветствуется. Заранее спасибо! <<>>

Правильное решение для iOS 13+ с UINavigationController

Проблема, с которой вы столкнулись, действительно распространена. Основная причина — UINavigationController "перехватывает" управление строкой состояния у своих дочерних контроллеров. Вот пошаговое решение для iOS 13+.

Шаг 1: Настройка Info.plist

Убедитесь, что в Info.plist установлено:

UIViewControllerBasedStatusBarAppearance → YES

Это позволяет каждому ViewController индивидуально управлять строкой состояния.

Шаг 2: Создайте кастомный UINavigationController

Создайте подкласс UINavigationController и переопределите в нём childForStatusBarStyle:

class CustomNavigationController: UINavigationController {
    override var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

Это заставит NavigationController делегировать управление строкой состояния текущему верхнему ViewController.

Шаг 3: Переопределите preferredStatusBarStyle в ваших ViewController

В каждом ViewController, где нужен свой стиль:

class ViewController: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent // или .darkContent
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setNeedsStatusBarAppearanceUpdate()
    }
}

Шаг 4: Используйте кастомный NavigationController в Storyboard

В Storyboard выберите ваш NavigationController и в Identity Inspector измените Class на CustomNavigationController.

Альтернативный вариант без подкласса

Если не хотите создавать подкласс, можно переопределить preferredStatusBarStyle напрямую в NavigationController:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.navigationBar.barStyle = .black
    }
}

Установка barStyle = .black автоматически делает текст Status Bar белым.

Важные моменты:

  • iOS 13+: UIApplication.shared.statusBarStyle устарел и не работает
  • UINavigationController: всегда переопределяет childForStatusBarStyle, если не указано иное
  • Анимация: для плавного изменения используйте UIView.animate с setNeedsStatusBarAppearanceUpdate

Полный рабочий пример:

// CustomNavigationController.swift
import UIKit

class CustomNavigationController: UINavigationController {
    override var childForStatusBarStyle: UIViewController? {
        return topViewController
    }
}

// FirstViewController.swift
class FirstViewController: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

// SecondViewController.swift
class SecondViewController: UIViewController {
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .darkContent
    }
}

Теперь каждый экран будет иметь свой стиль строки состояния, а UINavigationController не будет мешать.

<<>>

Простое решение через UINavigationBar.appearance()

Если вам нужно единое оформление для всего приложения или вы не хотите создавать подклассы, используйте глобальную настройку через appearance:

// AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Устанавливаем тёмный стиль Navigation Bar
    UINavigationBar.appearance().barStyle = .black
    // Это автоматически сделает текст Status Bar белым
    return true
}

Этот метод работает во всех версиях iOS, начиная с iOS 7. Он простой и не требует изменений в каждом ViewController. Минус — одинаковый стиль для всех экранов.

Если нужно переключить обратно на тёмный текст (например, на светлом фоне), просто установите:

UINavigationBar.appearance().barStyle = .default

Для более тонкой настройки можно комбинировать с установкой цвета Navigation Bar:

UINavigationBar.appearance().barTintColor = UIColor.black
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [.foregroundColor: UIColor.white]