2010-07-27 3 views
5

Контроллер корневого представления моего приложения поддерживает любую ориентацию, но пользователь может перейти к другому контроллеру представления, который поддерживает только ландшафтную ориентацию.Высота панели навигации iPhone остается короткой в ​​портретной ориентации

Основная проблема заключается в том, что независимо от фактической физической ориентации устройства, когда пользователь возвращается к контроллеру корневого представления, панель навигации имеет высоту, которая подходит для ландшафтного режима. Я хотел бы выяснить, как заставить навигационную панель появляться с высотой 44 (высота портрета) вместо 32 (высота ландшафта).

Хотя панель навигации не настроена на правильную высоту, UITableView контроллера корневого представления смещен правильно (44 пикселя от верхней части экрана).

Внутри -viewWillAppear вторую точка зрения контроллера: Я выполнить стандартное вращательное преобразование:

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]; 
    } 

Поскольку этот вторичный контроллер представления позволяет навигации на подчиненные контроллеры просмотреть (а также выскакивает обратно к контроллеру вида корневого), Я добавил следующее -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]; 
    } 

Спасибо за любые советы о том, как заставить пересчитать высоту панели навигации.

ответ

8

Не уверен, что, если есть лучший способ, но это сработало:

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

В основном скрыть панель навигации, поп контроллер представления и шоу СЧА бар. Некоторый код где-то регулирует высоту навигационной панели, и все в порядке.

+0

Спасибо, отлично, единственный способ заставить его снова работать в ios6 – AlexWien

+0

Как насчет ios10? Я столкнулся с этой проблемой, и решение не работает. – Slavcho

+0

@Slavcho. Сожалею. У меня нет ответа. Я не работаю над iOS уже некоторое время. – westsider