Изменение цвета текста заголовка панели навигации, когда для параметра "prefersLargeTitles" установлено значение true

У меня есть требование, в котором я должен использовать UINavigationBar с красным большим заголовком.

В настоящее время у меня есть следующий код:

func prepareNavigationController() {
    let navController = UINavigationController(rootViewController: self)
    navController.navigationBar.prefersLargeTitles = true
    navigationItem.searchController = UISearchController(searchResultsController: nil)
    navigationItem.hidesSearchBarWhenScrolling = false
    navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor.rawValue: UIColor.red]
}

Но это на самом деле не тонирует ярлык заголовка красным. Это результат:

Игнорируемый цвет заголовка

Но изменение prefersLargeTitles на false делает правильную вещь, а мой заголовок красный.

navController.navigationBar.prefersLargeTitles = false

Tinted Title

Я не совсем уверен, что это ошибка, поскольку на момент написания этой статьи мы все еще находимся в первой бета-версии, или если это преднамеренное поведение, в основном из-за того, что у меня нет ни одного из приложений Apple, Есть ли способ получить большой заголовок для любого цвета, который я хочу?

Ответ 1

Существует новое свойство UINavigationBar "largeTitleTextAttribute", которое должно помочь с этим.

largeTitleTextAttribute

Вот пример кода, который вы можете добавить к вашему представлению. viewDidLoad метод

        navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]

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

Вот пример кода и скриншот без набора больших TitleTextAttributes, но для barStyle установлено значение .black

        navigationController?.navigationBar.barStyle = .black

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

Вот скриншот без setTitleTextAttributes, но barStyle установлен в .default

        navigationController?.navigationBar.barStyle = .default

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

Ответ 2

Не уверен, что это ошибка в бета-версии 1 и 2, но вот способ установить цвет. Это немного "хакерское" обходное решение, но оно должно работать до тех пор, пока Apple не решит это. В версиях Objective-C и Swift этот код используется в методе viewDidAppear:.

Objective-C:

dispatch_async(dispatch_get_main_queue(), ^{
    for (UIView *view in self.navigationController.navigationBar.subviews) {
        NSArray <__kindof UIView *> *subviews = view.subviews;
        if (subviews.count > 0) {
            UILabel *label = subviews[0];
            if (label.class == [UILabel class]) {
                [label setTextColor:[UIColor redColor]];
            }
        }
    }
});

Swift:

DispatchQueue.main.async {
     for view in self.navigationController?.navigationBar.subviews ?? [] {  
     let subviews = view.subviews  
     if subviews.count > 0, let label = subviews[0] as? UILabel {  
           label.textColor = UIColor.red
 } } }

Ответ 3

То, как вы делаете это в iOS 13, изменилось, теперь вы используете класс UINavigationBarAppearance как это…

let appearance = UINavigationBarAppearance(idiom: .phone)
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.titleTextAttributes = [.foregroundColor: UIColor.systemRed]
appearance.backgroundColor = .white
navigationItem.standardAppearance = appearance
navigationItem.scrollEdgeAppearance = appearance

Ответ 4

Здесь рабочий код для использования больших заголовков и устанавливает цвет текста небольших и больших заголовков на белый, как на iOS11 +, так и на старых версиях iOS.

// Will apply to versions before iOS 11
navigationController?.navigationBar.titleTextAttributes = [
    NSAttributedStringKey.foregroundColor: UIColor.white
]

if #available(iOS 11.0, *) {
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationController?.navigationBar.largeTitleTextAttributes = [
        NSAttributedStringKey.foregroundColor: UIColor.white
    ]
}

(Раньше была ошибка в Xcode, но теперь она исправлена)

Ответ 5

При использовании раскадровки просто измените цвет заголовка "Большие текстовые атрибуты" в Инспекторе атрибутов панели навигации:

enter image description here