Question

Dans mon application, je suis un UINavigationController. Malheureusement, quand je tourne l'appareil et les changements d'orientation de l'interface, le UINavigationBar ne change pas sa hauteur. Dans d'autres applications de l'iPhone, comme le Contacts.app, la barre de navigation devient un peu moins haut en mode paysage. Il doit être intégré, parce que si vous prenez l'exemple d'application de navigation dans le menu XCode et ajouter l'orientation d'interface, il ne change la hauteur de la barre de navigation correctement.

Comment puis-je faire le redimensionnement de la barre de navigation comme il le fait dans tous les autres applications de l'iPhone que j'ai vu?

Était-ce utile?

La solution

Je l'ai fait un peu de tests, et bien que je ne aime pas la méthode, il est assez facile à faire.

Après avoir cherché une méthode privée qui peut avoir travaillé, je ne pouvais pas trouver un. Tout ce que je trouve était:

@property BOOL forceFullHeightInLandscape;

- (BOOL)isMinibar;

Il n'y a pas setter pour -isMinibar, donc nous ne pouvons pas régler cela. Je suppose qu'il retourne une valeur en fonction de sa hauteur. En outre, forceFullHeightInLandscape a été mis à NO, mais il n'a toujours pas ajuster sa hauteur.

Lors de la modification du autoresizingMask d'inclure UIViewAutoresizingFlexibleHeight, la vue ne redimensionnez à être plus petits, mais maintenant il était trop petit. Cependant, -isMinibar soudainement retourné YES. Alors, qui me fait penser à simplement laisser la vue Redimensionner lui-même, en l'ajustant à la bonne hauteur.

Alors là, nous allons, une méthode qui fonctionne, même sans appels API privé:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}

Une chose que vous aurez à traiter est que les vues sous la barre ne seront pas ajustés à la plus petite barre, de sorte qu'il y aura un écart entre la barre et les vues ci-dessous. Meilleure façon de résoudre ce problème est d'ajouter une vue du conteneur, tout comme le cas avec un UINavigationController. Vous viendriez avec quelque chose comme:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)];
}

- (void)resizeViewsForNavigationBar {
    [self.navigationBar sizeToFit];

    // Resize containerView accordingly.
    CGRect containerViewRect = self.containerView.frame;
    containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame);
    containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y;
    self.containerView.frame = containerViewRect;
}

Autres conseils

Je pense que le comportement que vous voulez que se produit lorsqu'un contrôleur de navigation (qui représente les barres (navigation ou la barre d'outils)), est ajouté à la fenêtre dans le délégué de l'application ou présenté par une barre d'onglets, etc.

Vous pouvez ajouter une barre de navigation via IB ou un code, cela ne signifie pas que vous avez un contrôleur de navigation. Mon avis est, créer un contrôleur de navigation et l'initialiser avec le contrôleur de vue que vous travaillez. Probablement lors de la rotation de vue, la barre de navigation se réduire un peu, la façon dont vous aimez.

Hope this helps

Merci à Joost J'ai ajouté

@property BOOL forceFullHeightInLandscape;

à ma classe UINavigationBar personnalisée. Et situé dans:

-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;

A travaillé comme un charme

Tout comme la réponse de Joost, mais mettre la méthode willAnimateRotationToInterfaceOrientation a un meilleur effet d'animation que willRotateToInterfaceOrientation. (Il n'y a pas de retard d'animation)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar sizeToFit];
}

Je viens d'avoir cette erreur aussi bien, et même si elle est probablement pas pour la même raison que je voudrais le poster ici pour aider quelqu'un d'autre que goofs.

Si vous surchargeons des méthodes de willRotateToInterface, rappelez-vous d'appeler super

J'obturé à ce sujet, mais une fois que je voyais la réponse accepté est venu me.

Je pense que celui-ci est un peu semblable à vous et ils ont l'extrait de code:

iPhone: UINavigationBar avec boutons - régler la hauteur

Je viens d'essayer quelques petites choses juste dans Interface Builder et Xcode et aussi longtemps que vous utilisez le UINavigationBarController comme RootViewController cela fonctionne comme décrit - en plus petit. Avez-vous changé des choses dans le contrôleur lui-même ou dans certaines parties de la façon dont le contrôleur est chargé? En particulier en ce qui concerne la mise à feu des événements? J'ai eu quelques mauvaises expiriences avec le UITabBarController en termes de briser la messagerie appropriée et a obtenu quelques vue « interessting » effets secondaires. Juste essayer et deviner.

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top