Автоанализация UINavigationBar
В моем приложении у меня есть UINavigationController. К сожалению, при повороте устройства и изменении ориентации интерфейса UINavigationBar не изменяет его высоту. В других приложениях iPhone, таких как Contacts.app, панель навигации становится чуть менее высокой в ландшафтном режиме. Он должен быть встроен, потому что если вы возьмете пример приложения навигации из меню XCode и добавьте ему ориентацию интерфейса, он правильно изменит высоту навигационной панели.
Как изменить размер панели навигации, как и во всех других iPhone-приложениях, которые я видел?
Ответы
Ответ 1
Я провел небольшое тестирование, и хотя мне не нравится этот метод, это довольно легко сделать.
Посмотрев на частный метод, который, возможно, сработал, я не смог его найти. Все, что я нашел, было:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
Нет установки для -isMinibar
, поэтому мы не можем установить это. Я предполагаю, что он возвращает значение, основанное на его высоте. Кроме того, forceFullHeightInLandscape
был установлен в NO
, однако он еще не отрегулировал его высоту.
При изменении autoresizingMask
для включения UIViewAutoresizingFlexibleHeight
представление изменило размер, чтобы быть меньше, но теперь оно было слишком маленьким. Однако -isMinibar
неожиданно вернулся YES
. Так что это заставило меня подумать только о том, чтобы просто изменить вид, отрегулировав его на правильную высоту.
Итак, мы идем, метод, который работает, даже без частных вызовов API:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
Одна вещь, с которой вам придется иметь дело, состоит в том, что представления под панелью не будут настроены на меньший балл, так что между баром и видами ниже будет разрыв. Самый простой способ решить это - добавить контейнерный вид, как и в случае с UINavigationController
. Вы бы придумали что-то вроде:
- (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;
}
Ответ 2
Я думаю, что поведение, которое вы хотите, происходит только тогда, когда навигационный контроллер (представляющий полосы (навигация или панель инструментов)) добавляется в окно делегата приложения или отображается панелью вкладок и т.д.
Вы можете добавить навигационную панель через IB или код, это не значит, что у вас есть контроллер навигации. Мое мнение состоит в том, что создайте контроллер навигации и инициализируйте его с помощью контроллера вида, в котором вы работаете. Вероятно, когда изображение вращается, навигационная панель немного уменьшится, как вам нравится.
Надеюсь, что это поможет
Ответ 3
Благодаря Joost я добавил
@property BOOL forceFullHeightInLandscape;
в мой пользовательский класс UINavigationBar. И установите в:
-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;
Работал как шарм
Ответ 4
Как и для ответа Joost, но метод willAnimateRotationToInterfaceOrientation
имеет лучший эффект анимации, чем willRotateToInterfaceOrientation
. (Нет задержки анимации)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar sizeToFit];
}
Ответ 5
У меня тоже была эта ошибка, и хотя она, вероятно, не по той же причине, я бы хотел опубликовать ее здесь, чтобы помочь кому-то еще, что goofs.
Если вы переопределяете любые методы willRotateToInterface
, не забудьте позвонить super
Я запустил это, но как только я увидел принятый ответ, он пришел ко мне.
Ответ 6
Я думаю, что это похоже на вас, и у них есть фрагмент кода:
iPhone: UINavigationBar с кнопками - настройка высоты
Ответ 7
Я просто пробовал несколько вещей только в интерфейсе Builder и Xcode, и пока вы используете UINavigationBarController
как RootViewController
, он работает так, как описано, - становится меньше. Вы меняли какие-либо вещи внутри самого контроллера или в части загрузки контроллера? Особенно в отношении увольнения событий? У меня были некоторые плохие переживания с UITabBarController
с точки зрения нарушения надлежащего обмена сообщениями и получения некоторых побочных эффектов "интереса". Просто попробуйте и догадайтесь.
Ответ 8
(void)viewWillLayoutSubviews {
self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}