Контроллер навигации отображается над представлением, на которое я перешел

Вы, ребята, наткнулись на эту проблему?

В основном в 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, волшебным образом!