UINavigationBar авторазмера - PullRequest
       19

UINavigationBar авторазмера

12 голосов
/ 21 августа 2010

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

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

Ответы [ 8 ]

19 голосов
/ 30 августа 2010

Я провел небольшое тестирование, и хотя мне не нравится этот метод, его довольно легко сделать.

Ища частный метод, который мог бы сработать, я не смог его найти,Все, что я нашел, было:

@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 голосов
/ 11 августа 2014

Аналогично ответу Джуста, но помещение метода в willAnimateRotationToInterfaceOrientation дает лучший анимационный эффект, чем willRotateToInterfaceOrientation. (Там нет задержки анимации)

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self.navigationBar sizeToFit];
}
2 голосов
/ 03 октября 2013

Благодаря Joost я добавил

@property BOOL forceFullHeightInLandscape;

в свой пользовательский класс UINavigationBar.И установить в:

-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;

работал как шарм

2 голосов
/ 30 августа 2010

Я думаю, что поведение, которое вы хотите, происходит, только когда контроллер навигации (который представляет панели (навигация или панель инструментов)), добавлен в окно в делегате приложения или представлен панелью вкладок и т. Д.

Вы можете добавить панель навигации через IB или код, это не значит, что у вас есть контроллер навигации.Мое мнение таково, создайте контроллер навигации и инициализируйте его с контроллером вида, в котором вы работаете. Возможно, когда вид вращается, панель навигации немного сжимается, как вам нравится.

Надеюсь, это поможет

1 голос
/ 17 июня 2012

У меня тоже была эта ошибка, и, хотя, вероятно, по той же причине я не хотел бы публиковать ее здесь, чтобы помочь кому-то еще, кто лукавит.методы, не забудьте позвонить super

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

0 голосов
/ 22 сентября 2014
(void)viewWillLayoutSubviews {
      self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}
0 голосов
/ 02 сентября 2010

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

0 голосов
/ 21 августа 2010

Я думаю, что это похоже на вас, и у них есть фрагмент кода:

iPhone: UINavigationBar с кнопками - отрегулируйте высоту

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...