Изменение цвета текста заголовка панели навигации, когда "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]
}

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

Ignored title color

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

navController.navigationBar.prefersLargeTitles = false

Tinted Title

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

3 ответов


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

largeTitleTextAttribute

вот пример кода, который вы можете добавить к контроллерам viewDidLoad метод

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

enter image description here

вот пример кода и скриншот без набора largeTitleTextAttributes, но barStyle имеет значение .черный

        navigationController?.navigationBar.barStyle = .black

enter image description here

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

        navigationController?.navigationBar.barStyle = .default

enter image description here


не уверен, что это ошибка в бета-версии 1 & 2, но вот способ установить цвет. Это немного "хакерский" обходной путь, но он должен работать, пока Apple не исправит это. В цели-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
 } } }

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