Изменение цвета текста заголовка панели навигации, когда "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
Я не совсем уверен, если это ошибка, так как на момент написания этой статьи мы все еще находимся в первой бета-версии, или если это преднамеренное поведение, в основном потому, что у меня нет ни одного из приложений Apple, цвет больших названий раньше. Есть ли способ на самом деле получить большой заголовок, чтобы иметь любой цвет, который я хочу?
3 ответов
существует новое свойство UINavigationBar "largeTitleTextAttribute", которое должно помочь в этом.
вот пример кода, который вы можете добавить к контроллерам viewDidLoad метод
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]
вот пример кода и скриншот без набора largeTitleTextAttributes, но barStyle имеет значение .черный
navigationController?.navigationBar.barStyle = .black
вот скриншот без набора largeTitleTextAttributes ,но для barStyle установлено значение.по умолчанию
navigationController?.navigationBar.barStyle = .default
не уверен, что это ошибка в бета-версии 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 была ошибка, но теперь она исправлена)