Автоматическое изменение размера UINavigationBar
-
30-09-2019 - |
Вопрос
В моем приложении у меня есть UINavigationController.К сожалению, когда я поворачиваю устройство и меняется ориентация интерфейса, UINavigationBar не меняет свою высоту.В других приложениях для iPhone, таких как Contacts.app, панель навигации становится немного менее высокой в альбомном режиме.Он должен быть встроенным, потому что если вы возьмете пример приложения навигации из меню XCode и добавите к нему ориентацию интерфейса, высота панели навигации изменится должным образом.
Как изменить размер панели навигации, как во всех других приложениях для iPhone, которые я видел?
Решение
Я сделал небольшое тестирование, и хотя мне не нравится метод, это довольно легко сделать.
Ищете частный метод, который, возможно, сработал, я не мог найти его. Все, что я нашел, было:
@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;
}
Другие советы
Я думаю, что желаемое поведение происходит только тогда, когда контроллер навигации (который представляет панели (навигацию или панель инструментов)) добавляется в окно в делегате приложения или представлен панелью вкладок и т. д.
Вы можете добавить панель навигации через IB или код, это не значит, что у вас есть контроллер навигации.Мое мнение таково: создайте контроллер навигации и инициализируйте его с помощью контроллера представления, в котором вы работаете.Вероятно, при повороте вида панель навигации немного сожмется, как вам нравится.
Надеюсь это поможет
Благодаря Joost я добавил
@property BOOL forceFullHeightInLandscape;
на мой пользовательский класс Uinaviginbar. И установить:
-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;
Работал как шарм
Похож на ответ Joost, но положить метод в willAnimateRotationToInterfaceOrientation
имеет лучший эффект анимации, чем willRotateToInterfaceOrientation
. Отказ (Нет задержки анимации)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar sizeToFit];
}
Я только что имел эту ошибку, и хотя это, вероятно, не по той же причине, по которой я хотел бы опубликовать его здесь, чтобы помочь кому-либо еще, что Goofs.
Если вы переопределите все willRotateToInterface
методы, Не забудьте позвонить super
Я очаровал на этом, но однажды я увидел принятый ответ, это пришло ко мне.
Я думаю, что этот тип похоже на вас, и у них есть фрагмент кода:
Я просто попробовал несколько вещей только в пределах интерфейса построителя и Xcode и до тех пор, пока вы используете UINavigationBarController
так как RootViewController
Работает как описано - становится меньшим. Вы изменили какие-либо вещи в сам контроллер или в частях того, как загружен контроллер? Особенно относительно стрельбы событий? У меня были плохие эксплуатации с UITabBarController
С точки зрения нарушения надлежащих обмен сообщениями и получили некоторые побочные эффекты «Берессет». Просто попытка и предположение.
(void)viewWillLayoutSubviews {
self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}