73
votes

La couleur de fond du tabbar de l'UitabbarCartroller de l'IOS 15 tourne noir

tabbar.bartintcolor ne peut pas être modifié dans iOS 15 Beta 4.

arrière-plan . Nous avons une application dans l'App Store et chaque année avant la nouvelle version iOS majeure, nous téléchargeons la version bêta iOS et testons notre application pour résoudre les problèmes à l'avance.

Notre problème . Cette année, lors du test dans iOS 15 Beta 4, nous avons trouvé la couleur de fond de Tabar de UitabbarController devient noir et rend difficile l'élément (icône et le titre). Dans notre code, nous avions soi.tabbar.bartintcolor = .white et cette ligne de code ne fonctionne pas dans iOS 15.

Nos tentatives . Je recherche en ligne et j'ai trouvé un problème similaire, pas exactement le même, signalé, https://developer.apple .com / forums / thread / 682420 . Et j'ai essayé standardAppearance mais ce n'est pas la solution car avec apparence Je ne peux pas modifier tabbar.tintcolor .


0 commentaires

17 Réponses :


80
votes

J'ai eu le même problème et j'ai trouvé le même lien que dans votre question. J'ai utilisé la même approche pour la barre d'onglet.

C'est le code que j'utilise et cela fonctionne parfaitement.

if #available(iOS 15.0, *) {
   let appearance = UITabBarAppearance()
   appearance.configureWithOpaqueBackground()
   appearance.backgroundColor = customColor
   
   self.tabController.tabBar.standardAppearance = appearance
   self.tabController.tabBar.scrollEdgeAppearance = view.standardAppearance
}


8 commentaires

Merci d'avoir répondu. Malheureusement, dans notre application, nous devons également définir Tabbar.tintColor en plus de tabbar.bartintcolor, mais avec l'apparence, nous n'avons pas accès à tabbar.tintcolor. Mais heureux de savoir que nous ne sommes pas le seul cas et j'espère qu'Apple remarquera mon rapport.


@Zhengqiankuang, avez-vous trouvé une solution au problème tabbar.tintcolor? J'ai également besoin de l'avoir réglé.


@Jerry Voir la réponse ici: stackoverflow.com/a/69200041/2108547 Les noms variables sont corrélés à ce qu'ils remplacent.


tabbar.scrolledGeAppearance est une nouvelle API sur iOS 15 qui doit être définie, définissant la même apparence sur cette propriété "Correction" du problème


J'ai dû utiliser presque toutes les mêmes lignes, à l'exception de l'apparence.ConfigurewithOpAqueBackground (). Mais cela pourrait dépendre, je suppose que vos couleurs / translucidité. Le mien avait une teintée bleue et un fond blanc. Maintenant, cela fonctionne parfaitement, également avec les «préferslargettitles»!


TabbarController? .Tabbar.ScrolledGeAPearance = TabbarController? .Tabbar.StandardAppearance


Devrait-il être self.tabbar.scrolledGeAppearance = Aspect ? La vue n'a pas de propriété d'apparence standard.


Fonctionne également pour la barre d'état si vous déclarez séparément une instance de uinavigationbarAppearance et appliquez ces mêmes propriétés.



15
votes

iOS 15 : Nous l'avons vu. C'est ce que j'ai changé dans notre storyboard pour le faire fonctionner: Entrez la description de l'image ici

Cela a légèrement modifié l'apparence dans iOS 14, mais c'était OK pour nos besoins.


1 commentaires

C'est la façon de le faire



23
votes

Créez un uitabbarAppearance comme celui-ci pour maintenir le même comportement visuel que les versions iOS précédentes:

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


1 commentaires

Merci d'avoir partagé. Peut-être partager l'objectif d'InlineLayoutApparence. Parce que StackEdLayoutApparence résout le problème. Ne pouvait pas comprendre le but des deux autres



49
votes

similaire à une réponse ci-dessus mais avec un correctif pour la vue qui n'est pas reconnue si vous utilisez des classes personnalisées:

if #available(iOS 15.0, *) {
    let appearance = UITabBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = .white
    tabBar.standardAppearance = appearance
    tabBar.scrollEdgeAppearance = tabBar.standardAppearance
}


1 commentaires

Il est préférable d'utiliser .SystemBackground comme backgroundColor , car cela changera automatiquement en noir en mode sombre.



21
votes

J'ai essayé les réponses ci-dessus qui sont correctes. Je veux ajouter plus de propriétés dans ces solutions. Mon exigence était de modifier Couleur d'arrière-plan de la barre d'onglet, de modification de la couleur d'image et de titre sélectionnée , en modifiant une couleur d'image et de titre sélectionnée . J'ai pu l'atteindre dans iOS 15 en utilisant le code ci-dessous.

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
    
}


0 commentaires

2
votes

xcode 13.0 - iOS 15.0

Mon objectif était de mettre à jour dynamiquement la teinte de la barre de navigation sur le changement de contrôleur de vue. J'ai défini ces paramètres en premier. Puis appelé cette fonction en cas de besoin avec uicolor je veux utiliser.

Appel:

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

Extension:

setNavigationBarAppearance(color: .green)


0 commentaires

-1
votes

Sous-classe à l'intérieur de UitabbarController

if #available(iOS 15.0, *) {
            let appearance = UITabBarAppearance()
            appearance.configureWithOpaqueBackground()
            appearance.backgroundColor = .white
            tabBar.standardAppearance =  appearance
            tabBar.scrollEdgeAppearance = tabBar.standardAppearance
        }


1 commentaires

En quoi est-ce différent de la stackoverflow.com/a/68749895/341994 ?



2
votes
  if #available(iOS 15.0, *) {
    navigationController?.view.backgroundColor = UIColor.colorName
  }

0 commentaires

7
votes

Pour moi, c'est simple et vous n'avez pas besoin d'accéder à l'instance uinavigationController . Appelez-le simplement à partir de appdelegate: DidFinishlAunchingwithoptions

if #available(iOS 15.0, *) {
    let appearance = UITabBarAppearance()
    appearance.configureWithOpaqueBackground()
    UITabBar.appearance().standardAppearance = appearance
    UITabBar.appearance().scrollEdgeAppearance = appearance
}


0 commentaires

6
votes

Ma barre d'onglet était transparente. Et ceci: tabbar.scrolledGeAppearance = tabbar.standardAppearance ne fait pas l'affaire pour moi.

J'ai dû le remplacer par tabbar.scrolledGeAPearance = Aspect . Je suppose que c'est la même chose pour la barre de navigation aussi.

Ainsi, la correction finale ressemble:

   if #available(iOS 15.0, *) {
        let appearance = UITabBarAppearance()
        appearance.configureWithOpaqueBackground()
        appearance.backgroundColor = .white //or whatever your color is
        
        tabBar.scrollEdgeAppearance = appearance
        tabBar.standardAppearance = appearance
    }

également le rafat touqir rafsun La réponse ci-dessus fonctionne bien si vous souhaitez définir l'apparence dans l'AppDelegate.

Testé sur iOS 15.0.1, Xcode 13.


0 commentaires

0
votes

Si vous ne voulez pas de paramètres ScrolledGeAPPEAPPARANCE, vous pouvez le remplacer en tant que rapport standard, et tous vos paramètres seront en apparence.

if #available(iOS 15.0, *) {
   tabBar.scrollEdgeAppearance = tabBar.standardAppearance
}


0 commentaires

2
votes

Voici mon implémentation, Objective-C, pour les deux uitabbar et uinavigationbar . Ils sont à peu près les mêmes.

Appelez cela dans le didfinishlaunchingwithoptions dans votre 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];
  }
}

p>


0 commentaires

3
votes

Pour Swift, j'utilise le code ci-dessous pour garder mon application a le même look qu'auparavant. Mon tabar a une couleur sélectionnée rose pour l'icône et le titre. Et avec la couleur de teinte gris par défaut.

pour utiliser configurewithDefaultBackground au lieu de configurewithopaquebackground parce que je veux un peu de transparence du tabar.

Pour l'instant, Cela fonctionne bien, continuez à chercher les derniers changements.

       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
        }


0 commentaires

5
votes

Mon application a une barre d'onglet opaque sous une vue de table. Dans iOS 14.x et plus tôt, il était suffisant pour définir le BartintColor sur un UIAPearance proxy, mais dans iOS 15.0, l'arrière-plan de la barre d'onglet était noir lorsque la vue de la table a fait T Atteignez le bas de l'écran.

Ma solution pour iOS 15 consiste à continuer à utiliser le proxy UIAPearance plutôt que la classe uitabbarAppearance . J'avais juste besoin de définir backgroundColor en plus de bartintcolor . Ceci est compatible en arrière au moins à iOS 11.

let tabBarAppearance = UITabBar.appearance()
tabBarAppearance.isTranslucent = false
tabBarAppearance.barTintColor = barColor
tabBarAppearance.backgroundColor = barColor


1 commentaires

Merci! J'ai eu le même problème lorsque le TableView n'a pas atteint le bas de l'écran, et cela a aidé.



2
votes

Après la mise à jour de Xcode 13 et iOS 15, j'ai également fait face à certains problèmes de barre d'onglet avec la couleur d'arrière-plan de la barre et la couleur du texte des éléments pour différents états. La façon dont je l'ai corrigé:

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
 }


0 commentaires

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

0 commentaires

-1
votes

C'est un moyen parfait de corriger la couleur du titre des éléments Tabbar pour sélectionner et les éléments normaux


0 commentaires