web-dev-qa-db-fra.com

La barre de navigation pour les gros titres iOS 11 ne s'effondre pas

Le Apple dans le ce qui est nouveau dans la vidéo WWDC de Cocoa Touch) indique que la nouvelle barre de navigation pour titres de grande taille s’accroche comme par magie à la vue de défilement de niveau supérieur du fichier sous-jacent. voir le contrôleur et se réduire/s’étendre automatiquement tout en défilant de haut en bas (et par "comme par magie", il voulait probablement dire qu’ils n’avaient pas réussi à ajouter cette fonctionnalité à la déjà embarrassante UINavigationController-UINavigationBar- UINavigationitem API de manière utilisable, ils ont donc dû se connecter à une vue de défilement choisie de manière heuristique dans les coulisses)

Même si je savais que cette réduction/expansion "automatique" ne fonctionnerait pas si je déviais le moins du système 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

Un UITabBarController qui contient un UINavigationController, qui contient un UIViewController, qui a un UITableView comme son view. En appuyant sur la première cellule du tableau, vous placez un deuxième contrôleur de vue sur la pile de navigation:

storyboard

Pas de code, juste le storyboard.

J'ai vérifié "Préfère les gros titres" pour que la barre de navigation active les gros titres. Maintenant, si je lance l'application et que je fais défiler la vue sous forme de tableau, la barre de navigation reste la même - grande - taille; ça ne s'écroule pas:

stuck with large title

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

interactive collapse works after back navigation

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

Et au fait, j'utilise l'iOS 11 officiellement sorti, pas les bêtas.

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

41
Tamás Zahola

Bonnes nouvelles! Je viens de comprendre que si je définissais "Grands titres" sur "Jamais" sur le storyboard, puis définissez-le via le code, puis cela fonctionne:

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

On dirait que Apple a oublié de gérer le cas lorsque l'élément de navigation a son largeTitleDisplayMode défini via l'interface Builder.

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 viewDidLoad.

Il suffit de faire cela sur le premier contrôleur de vue. Les contrôleurs de vue suivants respectent la valeur du storyboard.

24
Tamás Zahola

S'il existe une autre vue en plus de tableView, assurez-vous également que tableView se trouve en haut de cette ou ces vues, juste sous la zone de sécurité:

enter image description here

14
kamil3

Ou au lieu de changer quoi que ce soit dans le storyboard, procédez comme suit:

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

Peu importe la langue!

En effet, les gros titres sur les éléments de navigation décident s’ils doivent ou non être réduits en fonction du comportement des grands titres sur le titre de l’élément de navigation précédent.

10
D4ttatraya

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: si la tableView (ou l'élément avec défilement) n'est pas la première vue de votre hiérarchie, le titre de grande taille ne parvient pas à se masquer automatiquement.

Exemple qui ne fonctionnera PASExemple qui fonctionnera

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
    }
5
Sergio Trejo

@TamasZahola @ mohamede1945

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

navigationController?.navigationBar.prefersLargeTitles = true
1
satish