2010-07-27 4 views
5

Le contrôleur de vue racine de mon application prend en charge toutes les orientations, mais l'utilisateur peut accéder à un autre contrôleur de vue prenant uniquement en charge l'orientation paysage.La hauteur de la barre de navigation de l'iPhone reste courte en orientation portrait

Le problème de base est que, quelle que soit l'orientation physique réelle du périphérique, lorsque l'utilisateur revient au contrôleur racine, la barre de navigation a une hauteur appropriée pour le mode paysage. Je voudrais savoir comment faire apparaître la barre de navigation avec une hauteur de 44 (hauteur portrait) au lieu de 32 (hauteur paysage).

Bien que la barre de navigation ne soit pas définie à la bonne hauteur, le UITableView du contrôleur de vue racine est correctement décalé (44 pixels du haut de l'écran).

A l'intérieur du second de -viewWillAppear de contrôleur de vue: j'effectuer la transformation norme de rotation:

if (deviceOrientation == UIDeviceOrientationPortrait) 
    { 
    UIScreen *screen = [UIScreen mainScreen]; 
    CGFloat screenWidth = screen.bounds.size.width; 
    CGFloat screenHeight = screen.bounds.size.height; 
    UIView *navView = [[self navigationController] view]; 
    navView.bounds = CGRectMake(0, 0, screenHeight, screenWidth); 
    navView.transform = CGAffineTransformIdentity; 
    navView.transform = CGAffineTransformMakeRotation(degreesToRadians(90)); 
    navView.center = CGPointMake(screenWidth/2.0, screenHeight/2.0); 
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight]; 
    } 

Parce que ce contrôleur de vue secondaire permet la navigation aux contrôleurs de vue subordonnés (ainsi que popping retour à contrôleur de vue racine), J'ai ajouté ce qui suit à -viewWillDisappear:

if (deviceOrientation == UIDeviceOrientationPortrait) 
    { 
    UIScreen *screen = [UIScreen mainScreen]; 
    CGFloat screenWidth = screen.bounds.size.width; 
    CGFloat screenHeight = screen.bounds.size.height; 
    UIView *navView = [[self navigationController] view]; 
    navView.bounds = CGRectMake(0, 0, screenWidth, screenHeight); 
    navView.transform = CGAffineTransformIdentity; 
    navView.center = CGPointMake(screenWidth/2.0, screenHeight/2.0); 
    [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]; 
    } 

Merci pour tout conseil sur la façon de forcer le recalcul de la hauteur de la barre de navigation.

Répondre

8

Je ne sais pas s'il y a une meilleure façon, mais cela a fonctionné:

[[self navigationController] setNavigationBarHidden:YES animated:NO]; 
[[self navigationController] popViewControllerAnimated:YES]; 
[[self navigationController] setNavigationBarHidden:NO animated:NO]; 

Fondamentalement, cacher la barre de navigation, pop le contrôleur de vue et le spectacle de la barre de navigation. Quelque code quelque part ajuste la hauteur de la barre de navigation et tout va bien.

+0

Merci parfait, la seule façon de le faire fonctionner à nouveau dans ios6 – AlexWien

+0

Qu'en est-il de ios10? J'ai fait face à ce problème et la solution ne fonctionne pas. – Slavcho

+0

@Slavcho. Pardon. Je n'ai pas de réponse. Je n'ai pas travaillé sur iOS depuis un certain temps maintenant. – westsider

Questions connexes