custom color change bar ios uikit uinavigationbar ios11

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.

largeTitleTextAttribute

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 } } }


Si usa el guión gráfico, simplemente cambie el color del título "Atributos del texto del título grande" en el Inspector de atributos de la barra de navegación: