ios - color - set navigation bar swift
Cambiar el color del texto de un título de la barra de navegación cuando "prefersLargeTitles" se establece en verdadero (4)
Tengo un requisito en el que tengo que usar una UINavigationBar
con un título grande de color rojo.
Actualmente, tengo el siguiente código:
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]
}
Pero en realidad no está teñiendo la etiqueta del título a rojo. Este es el resultado:
Pero cambiar prefersLargeTitles
a false hace lo correcto, y mi título es rojo.
navController.navigationBar.prefersLargeTitles = false
No estoy completamente seguro de si esto es un error ya que en el momento de escribir este artículo todavía estamos en la primera versión beta, o si se trata de un comportamiento intencional, principalmente porque no tengo ninguna de las aplicaciones de Apple que colorean los grandes títulos anteriores. ¿Hay alguna manera de obtener el título grande para tener el color que quiero?
Aquí está el código de trabajo para usar títulos grandes y establece el color del texto de los títulos pequeños y grandes en blanco, tanto en iOS11 + como en versiones anteriores de 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
]
}
(Solía haber un error en Xcode, pero ahora parece estar arreglado)
Hay una nueva propiedad de UINavigationBar "largeTitleTextAttribute" que debería ayudar con esto.
Aquí hay un código de ejemplo que puede agregar a sus controladores de vista método viewDidLoad
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor: UIColor.blue]
Aquí hay un código de ejemplo y una captura de pantalla sin el conjunto largeTitleTextAttributes, pero barStyle está establecido en .black
navigationController?.navigationBar.barStyle = .black
Aquí hay una captura de pantalla sin el conjunto largeTitleTextAttributes, pero barStyle está establecido en .default
navigationController?.navigationBar.barStyle = .default
No estoy seguro de si es un error en la versión beta 1 y 2, pero aquí hay una manera de establecer el color. Es una solución un poco "hacky", pero debería funcionar hasta que Apple arregle esto. Tanto en la versión de Objective-C como en la de Swift, este código va en el método viewDidAppear:
.
C objetivo:
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]];
}
}
}
});
Rápido:
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
} } }