Контроллер навигации отображается над представлением, на которое я перешел
Вы, ребята, наткнулись на эту проблему?
В основном в iOS 7 контроллер навигации отображается над под-представлением, к которому я подключился.
В представлении iOS 6 я перехожу к окну навигации между нижним колонтитулом. В iOS 7 похоже, что суб-просмотр отображается в полноэкранном режиме под панелью навигации и нижним колонтитулом. В результате пользователь этого не видит.
Вот как я просматриваю subview
BRSMyListSubViewController *tagsInfoVC = [[BRSMyListSubViewController alloc] initWithCheckinsList:self.checkinsList
selectedTag:[self tagByIndexPath:indexPath]];
[self.navigationController pushViewController:tagsInfoVC animated:YES];
Вот как я инициализирую его в viewDidLoad
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(settings:)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Logout" style:UIBarButtonItemStyleBordered target:self action:@selector(logout:)];
Для чего стоит упомянуть, что под-просмотр определяется в XIB с помощью Autolayout. Вот источник моего XIB: http://pastebin.com/6RR0zYu4
И, наконец, вот как это выглядит в iOS 6
![enter image description here]()
И в iOS 7
![enter image description here]()
Любые мысли?
Ответы
Ответ 1
Ну, я понял это.
В вашем подзадаче (BRSMyListSubViewController
в моем случае), в viewDidLoad
, вам нужно установить один из этих двух
self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;
ИЛИ
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
Интересно, что в корневом представлении эти значения установлены по умолчанию UIRectEdgeAll
, NO
и YES
соответственно, но его tableView
НЕ находится под навигационной панелью и нижним колонтитулом.
Я не знаю, почему это так нелогично.
Также странно, что edgesForExtendedLayout
следует смешивать с одним из двух других свойств, хотя он явно ответственен за поведение.
PS. Для тех, кто хочет запустить его на iOS 6. Сконфигурируйте код с помощью if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
Ответ 2
Если вы не против иметь непрозрачную панель навигации, самым простым решением может быть это в контроллере представления, который создает ваш контроллер навигации:
self.navigationController.navigationBar.translucent = NO;
Позиционирование фрейма будет тогда принимать то же поведение, что и iOS6, волшебным образом!