Подтвердить что ты не робот

Автоанализация UINavigationBar

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

Как изменить размер панели навигации, как и во всех других iPhone-приложениях, которые я видел?

4b9b3361

Ответ 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

Я запустил это, но как только я увидел принятый ответ, он пришел ко мне.

Ответ 7

Я просто пробовал несколько вещей только в интерфейсе Builder и Xcode, и пока вы используете UINavigationBarController как RootViewController, он работает так, как описано, - становится меньше. Вы меняли какие-либо вещи внутри самого контроллера или в части загрузки контроллера? Особенно в отношении увольнения событий? У меня были некоторые плохие переживания с UITabBarController с точки зрения нарушения надлежащего обмена сообщениями и получения некоторых побочных эффектов "интереса". Просто попробуйте и догадайтесь.

Ответ 8

(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}