Я совершенно заблудился, пытаясь понять это специфическое поведение в iOS. После 14 часов, прочитав бесчисленные вопросы о переполнении стека и изучив все соответствующие документы Apple, я все еще в замешательстве, так что я надеюсь, что конкретный пример поможет эксперту объяснить его мне.
У меня есть контроллер модального представления, который я представляю (это проблемное поведение применимо к любому из готовых контроллеров Apple, не похоже, какой именно.)
Проще говоря, устройство повернуто в горизонтальное положение. Если я позвоню:
[rootViewController presentModalViewController:modalVC animated:YES];
На iPhone он представлен, как и ожидалось.
На iPad он также отображается как ожидалось (содержится в виде страницы с серым фоном)
Позже, в делегате modalVC для встроенной кнопки «Готово», я вызываю:
[rootViewController dissmissModalViewControllerAnimated: YES];
Вот где начинаются симптомы:
На iPhone независимо от того, от того, должен ли rootViewController долженAutoRotateToInterfaceOrientation возвращать ДА или НЕТ, строка состояния сразу входит в портретную ориентацию; модал затем выдвигается в неправильном (книжном, направленном) направлении, и базовый rootViewController теперь отображается в книжной ориентации, не запрашивая его shouldAutoRotate.
На iPad я получаю ожидаемое поведение - модал отклоняется, как ожидалось, и ориентация остается, как и ожидалось.
Что я не понимаю здесь? Я перепробовал много вещей, в том числе переопределение поведения shouldAUtoRotate для modalViewController и использование различных контейнерных viewController. Единственным эффективным решением было создать заглушку UIViewController, прикрепить его представление к keyWindow и вместо этого представить модальное внутри него. Хотя это решает проблему, многочисленные статьи Apple и сторонние организации заявляют, что это неверно (по уважительной причине, так как это не позволяет правильному распространению событий достичь этой заглушки UIViewController.)