Изменение цвета текста заголовка панели навигации, когда для параметра preferencesLargeTitles установлено значение 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

Тонированный заголовок

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


person Andy Ibanez    schedule 18.06.2017    source источник
comment
Я ищу то же самое! И я еще не нашел, как это изменить, возможно, поскольку это первая бета-версия, Apple еще не внедрила ее.   -  person Philippe    schedule 19.06.2017
comment
Возможно, это правильный ответ stackoverflow.com/a/46007201/7048642   -  person Kevin Furman    schedule 04.09.2017


Ответы (5)


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

largeTitleTextAttribute

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

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

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

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

        navigationController?.navigationBar.barStyle = .black

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

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

        navigationController?.navigationBar.barStyle = .default

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

person assb10yr    schedule 12.07.2017
comment
Интересный. Это новинка для бета-версии 3? Я еще не скачал его, но я сделаю это сейчас и проверю. - person Andy Ibanez; 12.07.2017
comment
Да, новичок в бета 3. По крайней мере, я это только сейчас заметил. - person assb10yr; 12.07.2017
comment
Я подтвержу через несколько часов (медленный интернет), потому что символ не существует в бета-версии 2. - person Andy Ibanez; 12.07.2017
comment
Я могу подтвердить, что символ есть в бета-версии 3. Очень интересная находка, сейчас я посмотрю, работает ли она. Если это так, я отмечу ваш ответ как принятый (при условии, что вы добавите пример кода, чтобы помочь будущим людям, которые наткнутся на этот вопрос). - person Andy Ibanez; 13.07.2017

То, как вы это делаете в 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
person Ashley Mills    schedule 16.06.2019
comment
Установка свойства standardAppearance моего navigationItem не имеет никакого эффекта. В частности, я делаю это внутри viewWillAppear моего контроллера представления и использую UINavigationBarAppearance для установки largeTitleTextAttributes. Любые мысли о том, почему это может быть так? - person josephap; 19.01.2020

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

Цель-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]];
            }
        }
    }
});

Быстрый:

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
 } } }
person anthonya1999    schedule 25.06.2017
comment
На самом деле это единственное решение, которое сработало для меня на iOS 12. - person ChavirA; 22.10.2018

Если вы используете раскадровку, просто измените цвет заголовка «Атрибуты текста большого заголовка» в инспекторе атрибутов панели навигации:

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

person M Reza    schedule 05.01.2019

Вот рабочий код для использования больших заголовков и установки белого цвета текста маленьких и больших заголовков как в 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 была ошибка, но теперь она исправлена)

person Kqtr    schedule 03.02.2018