tabBar.barTintColor no se puede cambiar en iOS 15 beta 4.
Antecedentes Tenemos una aplicación en la App Store y cada año, antes del lanzamiento de la nueva versión principal de iOS, descargamos la versión beta de iOS y probamos nuestra aplicación para solucionar los problemas de antemano.
nuestro problema Este año, cuando probamos en iOS 15 beta 4, encontramos que el color de fondo de la barra de pestañas de UITabBarController se vuelve negro y hace que el elemento (tanto el ícono como el título) sea difícil de leer. En nuestro código teníamos self.tabBar.barTintColor = .white y esta línea de código no funciona en iOS 15.
Nuestros intentos . Busqué en línea y encontré un problema similar, no exactamente el mismo, https://developer.apple.com/forums/thread/682420 . Y probé la apariencia standardAppearance pero esta no es la solución, ya que con la appearance no puedo cambiar tabBar.tintColor .
Tuve el mismo problema y encontré el mismo enlace que está en tu pregunta. Usé el mismo enfoque para la barra de pestañas.
Este es el código que estoy usando y funciona perfectamente.
if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = customColor self.tabController.tabBar.standardAppearance = appearance self.tabController.tabBar.scrollEdgeAppearance = view.standardAppearance }iOS 15 : Vimos esto. Esto es lo que cambié en nuestro guión gráfico para que funcione: 
Esto alteró ligeramente la apariencia en iOS 14, pero estuvo bien para nuestras necesidades.
Cree un UITabBarAppearance como este para mantener el mismo comportamiento visual que las versiones anteriores de iOS:
@available(iOS 15.0, *) private func updateTabBarAppearance() { let tabBarAppearance: UITabBarAppearance = UITabBarAppearance() tabBarAppearance.configureWithOpaqueBackground() let barTintColor: UIColor = .white tabBarAppearance.backgroundColor = barTintColor updateTabBarItemAppearance(appearance: tabBarAppearance.compactInlineLayoutAppearance) updateTabBarItemAppearance(appearance: tabBarAppearance.inlineLayoutAppearance) updateTabBarItemAppearance(appearance: tabBarAppearance.stackedLayoutAppearance) self.tabBar.standardAppearance = tabBarAppearance self.tabBar.scrollEdgeAppearance = tabBarAppearance } @available(iOS 13.0, *) private func updateTabBarItemAppearance(appearance: UITabBarItemAppearance) { let tintColor: UIColor = .red let unselectedItemTintColor: UIColor = .green appearance.selected.iconColor = tintColor appearance.normal.iconColor = unselectedItemTintColor }Similar a una respuesta anterior pero con una solución para que la vista no se reconozca si está utilizando clases personalizadas:
if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .white tabBar.standardAppearance = appearance tabBar.scrollEdgeAppearance = tabBar.standardAppearance }Intenté las respuestas anteriores que son correctas. Quiero agregar más propiedades en esas soluciones. Mi requisito era cambiar el color de fondo de la barra de pestañas, cambiar la imagen seleccionada y el color del título , cambiar la imagen no seleccionada y el color del título . Pude lograrlo en iOS 15 usando el siguiente código.
if #available(iOS 15.0, *){ let appearance = UITabBarAppearance() appearance.configureWithDefaultBackground() appearance.backgroundColor = UIColor.appDarkColorLightShade appearance.compactInlineLayoutAppearance.normal.iconColor = .lightText appearance.compactInlineLayoutAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.lightText] appearance.inlineLayoutAppearance.normal.iconColor = .lightText appearance.inlineLayoutAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.lightText] appearance.stackedLayoutAppearance.normal.iconColor = .lightText appearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor : UIColor.lightText] self.tabBarController?.tabBar.standardAppearance = appearance self.tabBarController?.tabBar.scrollEdgeAppearance = self.tabBarController?.tabBar.standardAppearance self.tabBarController?.tabBar.tintColor = .white }else{ self.tabBarController?.tabBar.barTintColor = .appDarkColorLightShade self.tabBarController?.tabBar.unselectedItemTintColor = .lightText self.tabBarController?.tabBar.tintColor = .white }Xcode 13.0 - iOS 15.0
Mi objetivo era actualizar el color del tinte de la barra de navegación dinámicamente en el cambio del controlador de vista. Establecí estos ajustes primero. Luego llame a esta función cuando sea necesario con UIColor que quiero usar.
Llamada:
setNavigationBarAppearance(color: .green)Extensión:
// MARK: Navigation Bar Appearance Function extension MainViewController { func setNavigationBarAppearance(color: UIColor) { if #available(iOS 15.0, *){ let appearance = UINavigationBarAppearance() appearance.configureWithDefaultBackground() appearance.backgroundColor = color // The background color. self.navigationController?.navigationBar.standardAppearance = appearance self.navigationController?.navigationBar.scrollEdgeAppearance = self.navigationController?.navigationBar.standardAppearance } else { // Background color support for older versions self.navigationController?.navigationBar.barTintColor = color } } }EDITAR: el color del tinte de la barra de navegación no funcionará en dispositivos anteriores al usar esta configuración, lo siento por la información errónea. Al revertir la configuración a continuación, el color del tinte funciona según lo previsto en todas las versiones.
Mi configuración (el color de tinte funciona perfectamente en iOS 13.5 y iOS 15):
Dentro de la subclase de UITabBarController
if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .white tabBar.standardAppearance = appearance tabBar.scrollEdgeAppearance = tabBar.standardAppearance } if #available(iOS 15.0, *) { navigationController?.view.backgroundColor = UIColor.colorName } func setupAppearance() { // Update based on your font requirements let font = UIFont.systemFont(ofSize: 12, weight: .bold) let tabBarAppearance = UITabBarAppearance() let tabBarItemAppearance = UITabBarItemAppearance() tabBarItemAppearance.normal.titleTextAttributes = [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: UIColor.gray] tabBarItemAppearance.selected.titleTextAttributes = [NSAttributedString.Key.font: font, NSAttributedString.Key.foregroundColor: UIColor.black] /* Note: To reset background and shadow properties to display opaque colors can use - tabBarAppearance.configureWithOpaqueBackground() */ tabBarAppearance.backgroundColor = .white tabBarAppearance.stackedLayoutAppearance = tabBarItemAppearance tabBar.standardAppearance = tabBarAppearance if #available(iOS 15.0, *) { tabBar.scrollEdgeAppearance = tabBarAppearance } }Mi aplicación tiene una barra de pestañas opaca debajo de una vista de tabla. En iOS 14.x y versiones anteriores, era suficiente configurar barTintColor en un proxy UIAppearance , pero en iOS 15.0 el fondo de la barra de pestañas era negro cuando la vista de la tabla no llegaba al final de la pantalla.
Mi solución para iOS 15 es continuar usando el proxy UIAppearance en lugar de la clase UITabBarAppearance más nueva. Solo necesitaba configurar backgroundColor además de barTintColor . Esto es compatible con versiones anteriores al menos con iOS 11.
let tabBarAppearance = UITabBar.appearance() tabBarAppearance.isTranslucent = false tabBarAppearance.barTintColor = barColor tabBarAppearance.backgroundColor = barColorDespués de la actualización a XCode 13 y iOS 15, también enfrenté algunos problemas con la barra de pestañas con el color de fondo de la barra y el color del texto de los elementos para diferentes estados. La forma en que lo arreglé:
if #available(iOS 15, *) { let tabBarAppearance = UITabBarAppearance() tabBarAppearance.backgroundColor = backgroundColor tabBarAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [.foregroundColor: selectedItemTextColor] tabBarAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor: unselectedItemTextColor] tabBar.standardAppearance = tabBarAppearance tabBar.scrollEdgeAppearance = tabBarAppearance } else { UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: selectedItemTextColor], for: .selected) UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: unselectedItemTextColor], for: .normal) tabBar.barTintColor = backgroundColor }Para mí, es simple y no necesita obtener acceso a la instancia de UINavigationController . Simplemente llámelo desde AppDelegate:didFinishLaunchingWithOptions
if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() UITabBar.appearance().standardAppearance = appearance UITabBar.appearance().scrollEdgeAppearance = appearance }Mi barra de pestañas era transparente. Y esto: tabBar.scrollEdgeAppearance = tabBar.standardAppearance no funciona para mí.
Tuve que reemplazarlo con tabBar.scrollEdgeAppearance = appearance . Supongo que también es lo mismo para la barra de navegación.
Así que la solución final se ve así:
if #available(iOS 15.0, *) { let appearance = UITabBarAppearance() appearance.configureWithOpaqueBackground() appearance.backgroundColor = .white //or whatever your color is tabBar.scrollEdgeAppearance = appearance tabBar.standardAppearance = appearance }Además, la respuesta anterior de Rafat touqir Rafsun funciona bien si desea configurar la apariencia en el appdelegate.
Probado en iOS 15.0.1, Xcode 13.
Si no desea configurar scrollEdgeAppearance, puede anularlo como apariencia estándar, y todas sus configuraciones estarán en ambas apariencias.
if #available(iOS 15.0, *) { tabBar.scrollEdgeAppearance = tabBar.standardAppearance }Aquí está mi implementación, Objective-C, tanto para UITabBar como para UINavigationBar . Son más o menos lo mismo.
Llame a esto en didFinishLaunchingWithOptions en su AppDelegate.m .
- (void)setupAppearance { if (@available(iOS 15, *)) { UIColor *color = [UIColor whiteColor]; // #F5F5F5 for white smoke. UITabBarAppearance *tabBarAppearance = [UITabBarAppearance new]; tabBarAppearance.backgroundColor = color; [[UITabBar appearance] setStandardAppearance:tabBarAppearance]; [[UITabBar appearance] setScrollEdgeAppearance:tabBarAppearance]; UINavigationBarAppearance *navBarAppearance = [UINavigationBarAppearance new]; navBarAppearance.backgroundColor = color; [[UINavigationBar appearance] setStandardAppearance:navBarAppearance]; [[UINavigationBar appearance] setScrollEdgeAppearance:navBarAppearance]; } }Para Swift, utilizo el siguiente código para mantener mi aplicación con el mismo aspecto que antes. Mi barra de pestañas tiene un color rosa seleccionado tanto para el ícono como para el título. Y con color de tinte gris predeterminado.
Usar configureWithDefaultBackground en lugar de configureWithOpaqueBackground porque quiero un poco de transparencia en la barra de pestañas.
Por ahora, está funcionando bien, sigue buscando los últimos cambios.
if #available(iOS 15, *) { let appearance = UITabBarAppearance() appearance.configureWithDefaultBackground() appearance.stackedLayoutAppearance.normal.iconColor = .systemGray appearance.stackedLayoutAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.systemGray] appearance.stackedLayoutAppearance.selected.iconColor = .systemPink appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.systemPink] // appearance.backgroundColor = .systemBackground self.tabBar.standardAppearance = appearance self.tabBar.scrollEdgeAppearance = appearance } if #available(iOS 13, *) { let appearance = UITabBarAppearance() appearance.shadowImage = UIImage() appearance.shadowColor = .white appearance.stackedLayoutAppearance.normal.iconColor = .systemGray appearance.stackedLayoutAppearance.normal.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.systemGray] // appearance.stackedLayoutAppearance.normal.badgeBackgroundColor = .yellow appearance.stackedLayoutAppearance.selected.iconColor = .systemPink appearance.stackedLayoutAppearance.selected.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.systemPink] self.tabBar.standardAppearance = appearance }