Как я могу программно определить, если ViewController представил UIModalPresentationFormSheet, открытый в полноэкранном режиме или нет?

Модальное представление ViewController на iPhone 6+ в стиле UIModalPresentationFormSheet открывается по-разному в зависимости от ориентации.

В портретном режиме это выглядит как обычный модал (так же, как меньшие айфоны). Но в ландшафтном режиме он открывается как форма (аналогично iPad).

Как я могу программно определить, какое состояние фактически использовалось (где-либо в жизненном цикле VC).

2 ответа

Решение

Контроллер отображается в виде листа формы, когда класс размера для контроллера имеет обычную ширину.

Таким образом, на iPhone 6+ в альбомной ориентации или на iPad в любой ориентации горизонтальный размерный класс является обычным, и форма отображается меньше полной ширины экрана.

Вы можете проверить это в контроллере, используя:

if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
  // ... Its showing as per the form specification
}
else{
  // ... Its showing as a modal full screen.
}

замещать self с переменной для контроллера, если вызывается откуда-то еще.

Это также относится и к случаю, когда вы можете использовать поповер, так как при использовании всплывающего окна на iPad класс размера изменяется на компактный внутри самого поповера.

Чистое решение Swift ниже. Расширение UIViewController, которое добавляет метод isBeingPresentedInFormSheet.

extension UIViewController {
    func isBeingPresentedInFormSheet() -> Bool {
        if let presentingViewController = presentingViewController {
            return traitCollection.horizontalSizeClass == .Compact && presentingViewController.traitCollection.horizontalSizeClass == .Regular
        }
        return false
    }
}

Этот метод возвращает значение true, если контроллер представления в настоящее время отображается в листе формы.

По моему опыту это происходит, когда

modalPresentationStyle = .FormSheet

а устройство представляет собой iPad или iPhone 6 Plus в альбомной ориентации.

Другие вопросы по тегам