В моем приложении я получил 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 или кода, это не означает, что у вас есть навигационный контроллер. Мое мнение таково: создайте навигационный контроллер и инициализируйте его с помощью контроллера представления, в котором вы работаете. Вероятно, когда представление вращается, панель навигации немного сжимается, как вам нравится.
Надеюсь, это поможет
Я только что попробовал кое-что только в Interface Builder и Xcode, и пока вы используете UINavigationBarController
как RootViewController
, он работает, как описано, — становится меньше. Изменили ли вы что-нибудь в самом контроллере или в части загрузки контроллера? Особенно по поводу стрельбы событиями? У меня был плохой опыт работы с UITabBarController
с точки зрения нарушения правильного обмена сообщениями, и я получил некоторые «интересные» побочные эффекты просмотра. Просто попытка и предположение.