- VC-A должен оставаться в книжной ориентации всегда. Никаких проблесков или анимации, связанных с альбомной ориентацией, даже при переходе к VC-B или обратно.
- Если VC-B отображается, когда устройство находится в альбомной ориентации, оно должно присутствовать в этой ориентации. ориентация (сдвиньте с длинной стороны экрана). Его также следует отклонить в этом направлении.
- В портретной ориентации VC-B должен отображать переход/анимацию по умолчанию, так что VC-A прижимается вниз и слегка масштабируется.
На данный момент я попробовал следующее:
Вариант 1: Пользовательский подкласс UINavigationController
Что-то похожее на ответ здесь, где содержащий контроллер навигации возвращает другое значение для поддерживаемыхInterfaceOrientations в зависимости от самого верхнего контроллера. Это работает, но нарушает (1) и (2) — при представлении или закрытии контроллера представления всегда присутствует анимация, требующая другой ориентации, чем предыдущая.
Я также попробовал представить модальный из прозрачного вложенного/дочернего контроллера представления, но он имеет аналогичные ограничения.

Вариант 2: несколько UIWindows (более перспективный)
Вместо представления VC-B непосредственно из VC-A (или общего родительского элемента) создайте новый прозрачный UIWindow и используйте его rootViewController для представления модального окна. Это прекрасно решает (1) и (2):

Однако на этапе (3) происходит сбой, поскольку листPresentationController больше не использует VC-A. Вместо этого анимируется чистый rootViewController, в результате чего поверх VC-A появляется прозрачная тень:

Эту тень/затемнение можно предотвратить, установив для крупнейшегоUndimmedDetentIdentifier значение .large:

Однако я просто хочу применить этот эффект к VC-A, а не исключить его полностью. Конечный результат должен выглядеть так же, как и без использования отдельного UIWindow:
[img]https://i.sstatic .net/ZkKNrDmS.gif[/img]
Я могу придумать некоторые возможные обходные пути, но не совсем уверен, как действовать. Я попытался представить прозрачный контроллер представления (назовем его VC-C) из VC-A одновременно с представлением VC-B из другого UIWindow. Это создает иллюзию, что VC-B представлен из той же иерархии представлений, что и VC-A (за счет того, что VC-A имеет желаемый эффект опускания), но усложняет увольнение. Достаточно тривиально гарантировать, что оба листа будут закрыты одновременно, если увольнение() используется напрямую, но если пользователь перетаскивает вниз VC-B, кажется довольно сложно синхронизировать VC-C с этим motion.
Есть ли какой-то другой метод или API, который мне не хватает? Может быть, какая-то загадочная конфигурация UISheetPresentationController, которую я проглядел, или хитрый способ использования пользовательских переходов? Какой-то способ отразить содержимое VC-A в rootViewController другого окна? Опять же, это вполне возможно, поскольку я видел, как это происходило в дикой природе.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ller-locke