56 votes

La barre de navigation à grands titres d'iOS 11 ne se réduit pas

Le gars d'Apple dans le Quoi de neuf dans Cocoa Touch, selon la vidéo de la WWDC que la nouvelle barre de navigation à grand titre s'accrochera comme par magie à la vue de défilement de niveau supérieur du contrôleur de vue sous-jacent et se réduira/se développera automatiquement lors du défilement vers le haut et vers le bas. (Et par "comme par magie", il voulait probablement dire qu'ils n'ont pas réussi à rajouter cette fonctionnalité dans la version déjà embarrassante de UINavigationController - UINavigationBar - UINavigationitem d'une manière utilisable, ils ont donc dû recourir à une vue de défilement choisie de manière heuristique dans les coulisses).

Même si j'étais préparé à ce que cet effondrement/déploiement "automatique" ne fonctionne pas si je m'écarte le moins du monde de la procédure de base UINavigationController + UITableView / UICollectionView il semble que même dans ce cas le plus simple, cela ne fonctionne pas comme prévu.

Voici ce que j'ai :

A UITabBarController qui contient un UINavigationController qui contient un UIViewController qui a un UITableView comme son view . Si vous tapez sur la première cellule du tableau, un deuxième contrôleur de vue sera placé sur la pile de navigation :

storyboard

Pas de code, juste le storyboard.

J'ai vérifié "Préfère les grands titres" pour la barre de navigation afin d'activer les grands titres. Maintenant, si j'exécute l'application et que je fais défiler l'affichage du tableau vers le haut ou vers le bas, la barre de navigation reste de la même taille - grande - et ne se réduit pas :

stuck with large title

Cependant, j'ai constaté que si je configure l'élément de navigation du deuxième contrôleur de vue pour utiliser la petite barre de navigation (en définissant le paramètre "Grand Titre" à la valeur "Jamais" ), puis si j'ouvre cette page et que je reviens en arrière, l'effondrement interactif se met à fonctionner comme par magie sur la première page :

interactive collapse works after back navigation

Est-ce que j'ai raté quelque chose ou est-ce que cette fonction ne fonctionne pas correctement ? Voici l'exemple de projet que j'utilise : https://github.com/tzahola/iOS-11-Large-Title-Navigation-Bar

Et d'ailleurs, j'utilise la version officielle d'iOS 11, pas les versions bêta.

2017-09-23 Mise à jour : J'ai envoyé un rapport de bug à Apple, et ouvert un ticket sur openradar.me : http://www.openradar.me/radar?id=5017601935671296

0 votes

Je vis exactement la même chose. Mon instinct me dit que c'est un bug.

0 votes

@Michael vérifiez ma réponse ci-dessous !

0 votes

@TamásZahola merci. Je vais essayer à nouveau ce soir.

38voto

kamil3 Points 492

S'il y a une autre vue en plus de tableView, assurez-vous également que tableView se trouve en haut de cette (ces) vue(s), juste en dessous de la zone de sécurité :

enter image description here

0 votes

Merci ! Cela m'a aidé !

0 votes

Cela m'a aidé aussi Merci !

28voto

Tamás Zahola Points 1352

Bonne nouvelle ! Je viens de comprendre que si je mets "Grands Titres" à "Jamais" sur le storyboard, puis le définir via le code, alors cela fonctionne :

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeAutomatic;
}

Il semble qu'Apple ait oublié de gérer le cas où l'élément de navigation a sa propre icône. largeTitleDisplayMode défini via le constructeur d'interface.

Donc jusqu'à ce qu'ils résolvent ce problème, laissez "Grands Titres" comme "Jamais" sur les storyboards, et les définir via le code dans les viewDidLoad .

Vous devez juste faire cela au premier contrôleur de vue. Les contrôleurs de vues suivants respectent la valeur dans le storyboard.

0 votes

Pourriez-vous préciser, s'il vous plaît, où puis-je trouver ce "Large Titles" sur Storyboards ? Tout ce que je trouve, c'est l'option "Prefers large titles" cochée sur les barres de navigation. Sur quel contrôleur appelez-vous l'extrait de code ci-dessus, sur la liste ou sur la page de détail ?

1 votes

@gklka Vous devez sélectionner l'élément de navigation sur le contrôleur de vue contenu dans le contrôleur de navigation !

0 votes

Comme l'a expliqué @TamásZahola. C'est très Il est important d'ajouter ce code (et de désactiver l'option "Automatic" / de la régler sur "Never" dans IB) au tout premier contrôleur de vue (Root ?) qui sera chargé par le contrôleur de navigation. Si vous le faites sur les contrôleurs de vue suivants, cela n'aura aucun effet !

14voto

D4ttatraya Points 2271

Ou au lieu de changer quoi que ce soit dans le storyboard, faites ceci :

override func viewDidLoad() {
    super.viewDidLoad()
    if #available(iOS 11.0, *) {
        self.navigationItem.largeTitleDisplayMode = .never
        self.navigationItem.largeTitleDisplayMode = .always
    }
}

Quelle que soit la langue !

En effet, les grands titres de l'élément de navigation décident de l'effondrement ou non en fonction du comportement des grands titres de l'élément de navigation de l'écran précédent.

0 votes

Pour compléter, le documentation indique que .always est destiné à : "Toujours afficher un grand titre" (qui serait alors vraisemblablement réduit), et .automatic, à : "Hériter du mode d'affichage de l'élément de navigation précédent". Ainsi, si le contrôleur de vue principal est .always et que les enfants sont tous .automatic, ils devraient tous agir comme .always.

5voto

Sergio Trejo Points 419

Comme je ne peux pas commenter, je vais partager ici la réponse que j'ai postée.

https://stackoverflow.com/a/47493375/8385022

J'ai trouvé une solution de contournement sur ce site En gros, si le tableView (ou l'élément qui a un scroll) n'est pas la première vue dans votre hiérarchie de vues, le grand titre ne se cache pas automatiquement.

Exemple qui ne fonctionnera PAS Un exemple qui fonctionne

https://markusbodner.com/2017/10/08/fix-large-navigation-bar-title-not-hiding-on-scroll-in-ios-11/

J'ai ajouté sur la vue willAppear :

        if #available(iOS 11.0, *) {
        navigationController?.navigationBar.prefersLargeTitles = true
    } else {
        // Fallback on earlier versions
    }

0 votes

Merci, cela résout mon problème, c'est la façon dont la zone de défilement ne sont pas minimiser le grand titre automatiquement sur le défilement, puisque ce n'est pas la première vue, merci beaucoup .

2voto

satish Points 11

@TamasZahola @mohamede1945

Les gars, j'ai eu le même problème. J'ai pu résoudre ce problème en ajoutant le snippet suivant sur mon premier contrôleur de vue du contrôleur de navigation.

navigationController?.navigationBar.prefersLargeTitles = true

0 votes

Où ? Utilisez-vous des Storyboards ?

0 votes

Oui, j'utilisais le storyboard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X