web-dev-qa-db-fra.com

Nouvelle apparence UINavigationBar dans le volet de détail d'UISplitViewController dans iOS 13

Sous iOS 13, si vous configurez un contrôleur de vue racine défilable (tel qu'un UITableViewController) dans un contrôleur de navigation, puis placez ce contrôleur de navigation dans le volet de détail d'un UISplitViewController, l'arrière-plan de la barre de navigation n'est pas visible lorsque le contenu défilant est au sommet.

Vous pouvez le voir en créant un nouveau projet iOS basé sur le modèle maître/détail. Modifiez ensuite le storyboard pour utiliser un UITableViewController à l'intérieur du contrôleur de navigation du volet de détails. Mettez l'appareil/le simulateur en mode d'apparence claire (il montre mieux le problème que le mode sombre). Exécutez l'application et notez que la zone de la barre de navigation est de la même couleur que l'arrière-plan de la table. Faites maintenant défiler la vue du tableau vers le haut et la couleur de la barre de navigation devient le gris clair standard. Laissez la vue de table revenir en haut et la couleur de la barre de navigation disparaît à nouveau.

Je ne l'ai vu que dans le volet de détail d'un contrôleur de vue fractionnée.

Comment désactivez-vous cette "fonctionnalité" pour que la barre de navigation soit normale, comme toutes les autres barres de navigation utilisées ailleurs que dans le volet de détail d'un contrôleur de vue fractionnée?

Il n'y a pas de modifications d'API pertinentes pour UISplitViewController ou UISplitViewControllerDelegate. Il n'y a rien non plus dans UINavigationController.

Après avoir creusé, j'ai trouvé une solution de contournement, mais j'aimerais trouver un moyen d'éviter d'avoir à le faire.

La classe UINavigationBar possède désormais de nouvelles propriétés pour définir son apparence. Curieusement, aucun de ces éléments n'est mentionné dans la section "Personnalisation de l'apparence d'une barre de navigation" de la documentation de UINavigationBar.

Il existe trois nouvelles propriétés dans iOS 13:

  • standardAppearance
  • compactAppearance
  • scrollEdgeAppearance

Les trois sont de type UINavigationBarAppearance.

Seul le premier est défini par défaut.

Même si scrollEdgeAppearance est nil, le volet de détail d'un contrôleur fractionné agit comme s'il avait été défini avec backgroundColor défini sur la couleur clear.

La solution consiste donc à ajouter la ligne suivante à la méthode viewDidLoad du contrôleur de vue racine du contrôleur de navigation:

navigationController?.navigationBar.scrollEdgeAppearance = navigationController?.navigationBar.standardAppearance

Pourquoi est-ce nécessaire uniquement dans ce cas? Existe-t-il une solution plus correcte autre que l'ajout de ce code?

J'ai remarqué qu'aucune des applications d'Apple (Mail, Notes et Fichiers au moins) ne semble utiliser cette "fonctionnalité".

19
rmaddy

La solution de contournement que vous avez trouvée est la façon "officielle" de désactiver ce comportement, comme expliqué dans un fil sur Twitter par David Duncan qui fait partie de l'équipe iOS System Experience chez Apple.

pour contrôler ce qui se passe lorsque la barre UINavigation est complètement déployée, vous voulez définir scrollEdgeAppearance. En définissant standardAppearance et scrollEdgeAppearance aux mêmes valeurs, vous obtiendrez une barre qui ne change pas.

Une application Apple Apple qui ne désactive pas ce comportement est l'application Paramètres.

8
Jordan H