Высота панели навигации iPhone остается небольшой в портретной ориентации - PullRequest
5 голосов
/ 27 июля 2010

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

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

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

1 Ответ

8 голосов
/ 23 октября 2010

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

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

По сути, скройте панель навигации, откройте контроллер вида и покажите панель навигации. Какой-то код где-то регулирует высоту панели навигации и все в порядке.

...