Mi aplicación iOS usa el guión gráfico para la interfaz de usuario y usa un tono personalizado para el color de fondo de la barra de navegación.
He probado mi aplicación en Xcode 13 beta 5 y la barra de navegación es "blanca" y el texto de la barra de navegación no está visible.
En el foro de desarrolladores de Apple en https://developer.apple.com/forums/thread/682420 se afirma que "En iOS 15, UIKit ha extendido el uso de scrollEdgeAppearance, que por defecto produce un fondo transparente, a todas las barras de navegación ." Para restaurar la apariencia anterior, debe adoptar las nuevas API de apariencia de UINavigationBar
Agregué el siguiente código (del enlace anterior) a la "aplicación (_ aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions" del delegado de la aplicación):
if #available(iOS 13, *) { let navigationController = UINavigationController(navigationBarClass: nil, toolbarClass: nil) let navigationBar = navigationController.navigationBar let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = UIColor(red: 0.0/255.0, green: 125/255.0, blue: 0.0/255.0, alpha: 1.0) navigationBar.standardAppearance = appearance; navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance navigationBar.isTranslucent = false }Esto no soluciona el problema. Todavía tengo el tinte personalizado establecido en el editor de guiones gráficos para la barra de navegación. ¿Necesito eliminar el tinte personalizado o estoy implementando incorrectamente la API de apariencia?
Si necesitamos cambiar el color de fondo y el color de los elementos seleccionados y no seleccionados, solo este código funcionó en mi caso
he usado esto para cambiar la apariencia del elemento tabBarAppearance.stackedLayoutAppearance = tabBarItemAppearance
if #available(iOS 15.0, *) { let tabBarAppearance = UITabBarAppearance() let tabBarItemAppearance = UITabBarItemAppearance() tabBarAppearance.backgroundColor = .white tabBarItemAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: Constants.Color.appDefaultBlue] tabBarItemAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.black] tabBarAppearance.stackedLayoutAppearance = tabBarItemAppearance tabBar.standardAppearance = tabBarAppearance tabBar.scrollEdgeAppearance = tabBarAppearance }Asegúrese de usar este código en la clase TabBar para obtener los resultados deseados, es posible que no funcione si lo usamos en AppDelegate para configurar la apariencia.
Este código se puede colocar en cualquier lugar, no solo en el Delegado de la aplicación para solucionar el problema en iOS15:
if (@available(iOS 15, *)){ UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init]; [appearance configureWithOpaqueBackground]; appearance.titleTextAttributes = @{NSForegroundColorAttributeName : UIColor.blackColor}; appearance.backgroundColor = [UIColor colorWithRed:0.0/255.0 green:125/255.0 blue:0.0/255.0 alpha:1.0]; self.navigationController.navigationBar.standardAppearance = appearance; self.navigationController.navigationBar.scrollEdgeAppearance = appearance; }Se arregló para mí en el generador de interfaz (xcode 13 - probado para iOS 13 y superior) y no fue necesario verificar la disponibilidad de iOS 15 (es decir, @disponible)
Buena suerte
Edité el código compartido por @Charlie Seligman porque no me funcionó porque tenía una vista de desplazamiento en una de mis pantallas. El siguiente código funciona incluso si tiene una vista de desplazamiento y una barra de navegación.
if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white] appearance.backgroundColor = UIColor(red: 0.89, green: 0.06, blue: 0.00, alpha: 1.00) UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }Código objetivo c: implemente esto en su función viewDidLoad
if (@available(iOS 15, *)){ UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init]; [appearance configureWithOpaqueBackground]; appearance.titleTextAttributes = @{NSForegroundColorAttributeName : UIColor.blackColor}; appearance.backgroundColor = [UIColor colorWithRed:0.0/255.0 green:125/255.0 blue:0.0/255.0 alpha:1.0]; self.navigationController.navigationBar.standardAppearance = appearance; self.navigationController.navigationBar.scrollEdgeAppearance = appearance; }Cualquiera que busque una solución de Objective-C, pruebe el siguiente código:
if (@available(iOS 15.0, *)) { UINavigationBarAppearance *navBarAppearance = [[UINavigationBarAppearance alloc] init]; [navBarAppearance configureWithOpaqueBackground]; navBarAppearance.backgroundColor = YOUR_COLOR; [navBarAppearance setTitleTextAttributes: @{NSForegroundColorAttributeName:[UIColor whiteColor]}]; self.navigationController.navigationBar.standardAppearance = navBarAppearance; self.navigationController.navigationBar.scrollEdgeAppearance = navBarAppearance; }Xcode 13+
En iOS 15, UIKit ha extendido el uso de scrollEdgeAppearance , que por defecto produce un fondo transparente, a todas las barras de navegación. El fondo se controla cuando la vista de desplazamiento desplaza el contenido detrás de la barra de navegación.
Para restaurar la apariencia anterior, debe adoptar las nuevas API de apariencia de UINavigationBar, UINavigationBarAppearance . Elimine sus personalizaciones existentes y haga algo como esto:
let appearance = UINavigationBarAppearance() appearance.backgroundColor = <your tint color> navigationBar.standardAppearance = appearance navigationBar.scrollEdgeAppearance = appearance También puede usar el proxy de apariencia con el código anterior, pero sustituyendo navigationBar.appearance().scrollEdgeAppearance = appearance en la última línea.
En AppDelegate.swift
ventana?.backgroundColor = .blanco
funcionó en mi caso
Para hacer esto solo con el guión gráfico, para construir sobre la respuesta de @Atka,
puede configurar atributos de texto de título personalizados al optar por atributos de título "Personalizados"
Probé varias formas, pero el siguiente código funcionó como Magic para restaurar la versión anterior.
if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .white UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }Aquí hay una versión si desea configurar un botón Atrás personalizado sin título y barra de navegación transparente
let backImg: UIImage = #imageLiteral(resourceName: "back") if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.titleTextAttributes = [.foregroundColor: UIColor.black] appearance.setBackIndicatorImage(backImg, transitionMaskImage: backImg) appearance.backButtonAppearance.normal.titlePositionAdjustment = UIOffset(horizontal: -1000.0, vertical: 0) UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }Mi implementación de la configuración de la barra de navegación como opaca y translúcida para iOS 15 y versiones anteriores:
extension UINavigationBar { static let defaultBackgroundColor = UIColor.red static let defaultTintColor = UIColor.white func setOpaque() { if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = UINavigationBar.defaultBackgroundColor appearance.titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor] UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance } else { setBackgroundImage(UIImage(), for: UIBarPosition.any, barMetrics: UIBarMetrics.defaultPrompt) shadowImage = UIImage() barTintColor = UINavigationBar.defaultBackgroundColor titleTextAttributes = [.foregroundColor: UINavigationBar.defaultTintColor] } isTranslucent = false tintColor = UINavigationBar.defaultTintColor } func setTranslucent(tintColor: UIColor, titleColor: UIColor) { if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithTransparentBackground() appearance.titleTextAttributes = [.foregroundColor: titleColor] standardAppearance = appearance scrollEdgeAppearance = appearance } else { titleTextAttributes = [.foregroundColor: titleColor] setBackgroundImage(UIImage(), for: UIBarMetrics.default) shadowImage = UIImage() } isTranslucent = true self.tintColor = tintColor }}
En mi caso, cuando actualizo a xcode13 e iOS15, descubrí que la barra de navegación y la barra de pestañas se vuelven transparentes. Mi viewController está incrustado en UINavigationController.
Después de una serie de pruebas, encontré que la configuración, el color de fondo del controlador de navegación, es la mejor manera de solucionar este problema.
navigationController?.view.backgroundColor = .yourColorUna vez que se establece el color, todo está bien.
Hazlo así:
let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .red appearance.titleTextAttributes = [.font: UIFont.boldSystemFont(ofSize: 20.0), .foregroundColor: UIColor.white] // Customizing our navigation bar navigationController?.navigationBar.tintColor = .white navigationController?.navigationBar.standardAppearance = appearance navigationController?.navigationBar.scrollEdgeAppearance = appearanceEscribí un nuevo artículo hablando de eso.
https://medium.com/@eduardosanti/uinavigationbar-is-black-on-ios-15-44e7852ea6f7
Creé esta extensión para admitir iOS 15 e iOS 12 para cambiar el fondo de la barra de navegación (tinte) y los colores del título solo en los lugares necesarios, no en toda la aplicación.
extension UINavigationBar { func update(backroundColor: UIColor? = nil, titleColor: UIColor? = nil) { if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() if let backroundColor = backroundColor { appearance.backgroundColor = backroundColor } if let titleColor = titleColor { appearance.titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor] } standardAppearance = appearance scrollEdgeAppearance = appearance } else { barStyle = .blackTranslucent if let backroundColor = backroundColor { barTintColor = backroundColor } if let titleColor = titleColor { titleTextAttributes = [NSAttributedString.Key.foregroundColor: titleColor] } } } }y utilícelo en los lugares necesarios (en mi caso, es la configuración de la interfaz de usuario de UIViewController) como este
func configureNavigationController() { navigationController?.navigationBar.update(backroundColor: .blue, titleColor: .white) }Si alguien necesita la versión Objective C de la respuesta de G. Steve
if (@available(iOS 15, *)){ UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init]; [appearance configureWithOpaqueBackground]; appearance.titleTextAttributes = @{NSForegroundColorAttributeName : UIColor.whiteColor}; appearance.backgroundColor = [UIColor colorWithRed:0.0/255.0 green:125/255.0 blue:0.0/255.0 alpha:1.0]; [UINavigationBar appearance].standardAppearance = appearance; [UINavigationBar appearance].scrollEdgeAppearance = appearance; }Este código se puede colocar en cualquier lugar, no solo en el Delegado de la aplicación para solucionar el problema en iOS15:
if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = <desired UIColor> navigationBar.standardAppearance = appearance; navigationBar.scrollEdgeAppearance = navigationBar.standardAppearance }No hay necesidad de cambiar nada en el guión gráfico. Esta es la solución que finalmente funcionó cuando se agregó a la aplicación App Delegate application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions :
//Fix Nav Bar tint issue in iOS 15.0 or later - is transparent w/o code below if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() appearance.titleTextAttributes = [.foregroundColor: UIColor.white] appearance.backgroundColor = UIColor(red: 0.0/255.0, green: 125/255.0, blue: 0.0/255.0, alpha: 1.0) UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }Tenga en cuenta que era necesario establecer el atributo de texto del título en "blanco" ya que el texto del título predeterminado era negro si no se especificaba este atributo.
También tenga en cuenta que esto solo debería aplicarse a la versión de iOS 15.0 o posterior. No funciona para versiones anteriores, ya que el tono personalizado de la barra de navegación del guión gráfico es el comportamiento predeterminado.
Para usar su propio esquema de color, use lo siguiente:
Rápido
// White non-transucent navigatio bar, supports dark appearance if #available(iOS 15, *) { let appearance = UINavigationBarAppearance() appearance.configureWithOpaqueBackground() UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance }C objetivo
if (@available(iOS 15.0, *)) { UINavigationBarAppearance *navBarAppearance = [[UINavigationBarAppearance alloc] init]; navBarAppearance.backgroundColor = [UIColor redColor]; [navBarAppearance configureWithOpaqueBackground]; [UINavigationBar appearance].standardAppearance = navBarAppearance; [UINavigationBar appearance].scrollEdgeAppearance = navBarAppearance; } Para obtener el comportamiento translúcido predeterminado, como era el predeterminado antes de iOS 15, simplemente configure scrollEdgeAppearance :
Rápido
if #available(iOS 15, *) { UINavigationBar.appearance().scrollEdgeAppearance = UINavigationBarAppearance() }C objetivo
if (@available(iOS 15.0, *)) { [UINavigationBar appearance].scrollEdgeAppearance = [[UINavigationBarAppearance alloc] init]; }