UITableView в UINavigationController попадает под панель навигации после поворота
Это портрет:
http://i45.tinypic.com/2cp6ttf.jpg
Это пейзаж
http://i47.tinypic.com/15g6ve9.jpg
Я попробовал это на ротации безуспешно:
self.tableView.autoresizesSubviews = YES;
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
8 ответов
Я столкнулся с этой проблемой недавно. В моем случае это было потому, что я выполнял ротации контроллера навигации, который не был корневым контроллером окна приложения. Поэтому я использовал подход слушателя поворота уведомлений / аффинного преобразования / настройки границ для изменения макета контроллера навигации. Это работало хорошо, но дало результаты, описанные здесь. Мне потребовалось некоторое время, чтобы заметить, что когда я поворачивался в альбомную ориентацию, высота панели навигации изменялась неправильно (т. Е. С 44 до 32 пикселей - уменьшенная высота рамки для ландшафтного режима). The root view controller of my app was responding to willRotateToInterfaceOrientation and didRotateFromInterfaceOrientation, however. That view controller also already knew about the associated navigation controller. I remedied the problem by adding the following code to the willRotateToInterfaceOrientation method:
CGRect frame = self.navViewController.navigationBar.frame;
if (toInterfaceOrientation == UIInterfaceOrientationPortrait || toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
frame.size.height = 44;
} else {
frame.size.height = 32;
}
self.navViewController.navigationBar.frame = frame;
Hope this saves somebody some time in a similar situation.
При использовании пользовательского контроллера представления в качестве пользователя root, который сам управляет другими контроллерами представления, он отвечает за пересылку всех событий поворота в текущий активный субконтроллер (если я могу так его назвать). Эти события:
– willRotateToInterfaceOrientation:duration:
– willAnimateRotationToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
– willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
– didAnimateFirstHalfOfRotationToInterfaceOrientation:
– willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:
Таким образом, в случае контроллера навигации, управляемого вашим пользовательским корневым контроллером, переадресация – willAnimateRotationToInterfaceOrientation:duration:
В навигационном контроллере исправлена проблема с неправильной высотой панели навигации при вращении.
Добавьте следующую строку в метод didRotateFromInterfaceOrientation.
[self.navigationController.view layoutSubviews];
Я надеюсь, что это будет делать.
У меня точно такая же проблема, и @jstevenco привел меня к действительно странному решению. Мои представления также автоматически изменяют размер при вращении, но табличное представление, кажется, не понимает, что там находится навигационный контроллер:
В tableviewcontroller добавьте следующее:
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
CGRect frame = navBar.frame;
if (fromInterfaceOrientation == UIInterfaceOrientationPortrait || fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
frame.size.height = 31.9;
} else {
frame.size.height = 44.1;
}
navBar.frame = frame;
}
31,9 и 44,1 очень важны душно! Оставляя это 32 и 44, изменение размера делать не нужно, поэтому, похоже, это игнорируется. Работал на меня, надеюсь, это поможет кому-то еще.
Эта проблема может возникнуть, если вы вызвали "willAnimateRotationToInterfaceOrientation:" в контроллере навигации, но забыли вызвать super из метода.
У вас должно быть что-то вроде этого:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation];
// Your code here
}
В этих ситуациях нужно обращать внимание на ориентацию строки состояния, если вы изменяете ее вручную. Если строка состояния не скрыта и вы меняете рамку своего вида, когда строка состояния имеет неправильную ориентацию (в вашем коде, возможно, вы обновляете ориентацию строки состояния сразу после смены рамки), она автоматически изменить размер панели навигации неправильно, даже если у вас нет автоматического изменения размера.
Я выгляжу так, как будто представление таблицы прокручивается немного после изменения ориентации.
Вы пробовали звонить scrollToRowAtIndexPath:atScrollPosition:animated:
и прокрутить до самого верхнего ряда?
Ваш UINavigationController
Нужно получать уведомления при изменении ориентации устройства. Этого не произойдет, если вы только добавите view
из UINavigationController
другому UIView
,
Начиная с iOS 5, вы можете просто позвонить addChildViewController:
на родителя UIViewController
, что обеспечит распространение изменений ориентации на этот дочерний контроллер представления.