UINavigationController внутри UIPopoverController "Назад" анимации странно в ландшафте

Я в тупике: -\

У меня есть устаревшее приложение в магазине, которое я обновляю для iOS 8/9. Он был написан много лет назад (pre-ARC) и является универсальным приложением для iPhone и iPad. Теперь все работает отдельно от этого...

На iPad есть панель инструментов в верхней части экрана, из которой я представляю UIPopoverControllers, содержащий UINavigationController, содержащий некоторые стандартные экраны типа UITableViewController, которые вы можете развернуть.

В Portrait (и Portrait Upside Down) все работает так, как ожидалось.

Однако в "Пейзаже" нажатие "Назад" (стандартная спина, а не обычная) вызывает странные анимации - исходящий контроллер выпрыгивает за пределы popover и быстро переходит на экран (направление, определяемое ориентацией устройства), в то время как входящий контроллер просто появляется сразу, как только исходящий контроллер выпрыгивает за пределы popover. Мне пришлось использовать медленные анимации, чтобы определить это, как на полной скорости, это просто выглядит как огромный сбой.

Там короткий 20-секундный фильм, показывающий дефект здесь; Обратите внимание, что происходит при нажатии "Местоположения" через 14 секунд.

Если вместо UIPopover я представляю стек VC как лист формы, все работает так, как ожидалось, независимо от ориентации. Я также попробовал новый UIPopoverPresentationController и испытал SAME проблему, которая немного меня удивила.

Это происходит на обоих поппосах, которые я представляю (один слева от панели инструментов, один справа от панели инструментов), и у них обоих очень разные внутренние элементы. Единственным распространенным фактором является то, что у них есть UINavigationController внутри UIPopover.

Я использовал отладчик вида для проверки иерархии представлений, но ничего не кажется необычным, и я не могу захватить представление во время сбоя независимо от того, насколько медленно я запускаю симулятор, поэтому я подозреваю, что вижу внутренняя проблема с контроллером popover или навигации.

Кто-нибудь видел что-то подобное? Я вижу это как на устройстве (iOS 8.4), так и в симуляторах для iOS 8 и 9.

Для контекста этот проект не имеет раскадровки, редко использует xibs и обычно создает пользовательский интерфейс в коде в loadView - это действительно старое приложение...

Спасибо за любые указатели. Не знаете, какой код здесь поможет, но здесь представлена ​​презентация заинтересованного адресата;


LocationsViewController* locationsvc = [[LocationsViewController alloc] init];

UINavigationController *localNavigationController = [[UINavigationController alloc] initWithRootViewController:locationsvc];
localNavigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
[locationsvc release];

UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:localNavigationController];

aPopover.delegate = self;
aPopover.backgroundColor = [UIColor colorWithWhite:0 alpha:0.9];
self.locationPopoverController = aPopover;        
[aPopover release];
[localNavigationController release];

[locationPopoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

Я получаю тот же дефект со следующим, новым кодом аромата;


UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:locationsvc];

locationsvc.preferredContentSize = CGSizeMake(320,280);

UIPopoverPresentationController *newPresentationController;
destNav.modalPresentationStyle = UIModalPresentationPopover;
newPresentationController = destNav.popoverPresentationController;
newPresentationController.barButtonItem = sender;
destNav.navigationBarHidden = NO;
[self presentViewController:destNav animated:YES completion:nil];

И та же проблема показывает, когда я использую UIModalPresentationPageSheet, но НЕ, когда я использую UIModalPresentationFormSheet.

Ответы

Ответ 1

У меня была такая же проблема. Проблема была исправлена ​​после добавления поддержки ландшафтной ориентации для просмотра контроллеров внутри навигационного контроллера.

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}