web-dev-qa-db-fra.com

iOS11 personnaliser la hauteur de la barre de navigation

Tout d'abord, merci d'être venu ici et de m'aider à résoudre mon problème. Je vous remercie!!!

Dans iOS11 beta6, sizeThatFits: ne semble pas fonctionner sur UINavigationBar. Je remarque que la structure de UINavigationBar a été modifiée par Reveal my app.

J'ai fait de mon mieux pour modifier la hauteur de la barre de navigation personnalisée. Mais cela semble toujours être 44, et cela fonctionne avant iOS11. 

- (CGSize)sizeThatFits:(CGSize)size {
    CGSize newSize = CGSizeMake(self.frame.size.width, 64);
    return newSize;
}

enter image description here

Bizarrement, je me connecte juste son cadre dans la méthode didMoveToSuperview, sa hauteur est de 64, mais je vois vraiment que c'est 44 dans Reveal et app.

Je n'en ai aucune idée ... Aidez-moi s'il vous plaît .. Merci.

Mettre à jour:

J'ai trouvé cela à propos de ma barre de navigation personnalisée LayoutConstraints se connecter à la console comme suit: 

"<NSAutoresizingMaskLayoutConstraint:0x604000495ae0 FDCustomNavigationBar:0x7fe2f01399d0.(null) == 42>",
"<NSAutoresizingMaskLayoutConstraint:0x604000495b30 FDCustomNavigationBar:0x7fe2f01399d0.height == 44>"`

bug je même pas utiliser la mise en page automatique dans ma barre de navigation. Qu'est ce qui ne va pas avec ça?

Mise à jour 8/28:

enter image description here

J'ai défini le cadre de sous-vues de ma barre de navigation personnalisée dans la méthode - layoutSubviews de la barre de navigation. 

- (void)layoutSubviews {
    [super layoutSubviews];

    self.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 64);

    for (UIView *view in self.subviews) {

        if([NSStringFromClass([view class]) containsString:@"Background"]) {
            view.frame = self.bounds;
        } else if ([NSStringFromClass([view class]) containsString:@"ContentView"]) {
            CGRect frame = view.frame;
            frame.Origin.y = 20;
            frame.size.height = self.bounds.size.height - frame.Origin.y;
            view.frame = frame;
        }
    }
}

mais la barre de navigation couvrira la vue du contrôleur de vue. Comment puis-je résoudre ce problème?

13
Jerry4me

Depuis iOS 11, UINavigationBar prend entièrement en charge la mise en page automatique (c’est la raison pour laquelle vous voyez ses contraintes). J'ai ouvert un radar à Apple parce que je pensais que définir une contrainte de hauteur sur titleView aurait ajusté la hauteur de la barre de navigation en conséquence. Cependant, voici ce que Apple a répondu:

La prise en charge complète de la présentation automatique ne signifie pas que votre vue peut influencer d’autres aspects de la présentation de la barre de navigation - en particulier, la barre de navigation applique sa propre hauteur et ne permet pas à la vue du titre ou à d’autres vues personnalisées de dépasser la hauteur de la vue. barre de navigation. Nous continuons à travailler sur cette question et nous vous contacterons à nouveau.

À ce jour, le radar est toujours ouvert.

9
emix

Bonjour, je viens de vivre ce même problème.

Désormais, le guide de présentation supérieur est obsolète sur iOS 11. Vous devez référencer le safeAreaLayoutGuide dans vos contraintes.

Voici un exemple dans Swift

    if #available(iOS 11, *) {
        let guide = self.view.safeAreaLayoutGuide.topAnchor
        let height = (self.navigationController?.navigationBar.frame.height)! - CGFloat(12)
        NSLayoutConstraint.activate([
        self.yourTableView.topAnchor.constraint(equalTo: guide, constant: height)
        ])
    }

Comme vous pouvez le voir, l'ancrage supérieur de votre vue doit correspondre à l'ancrage supérieur de safeAreaLayoutGuide. Dans cet exemple, j'utilise la variable height pour créer la nouvelle contrainte. La hauteur variable contient la hauteur de la barre de navigation moins une constante.

Vous devriez essayer en changeant la valeur de hauteur.

J'espère que cela vous aide.