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

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

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

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


person AShavit    schedule 20.04.2015    source источник
comment
Вы можете использовать этот modalTransitionStyle.   -  person SGDev    schedule 20.04.2015
comment
@SumitGarg modalTransitionStyle отображается даже на старых iPhone, когда ВК занимает весь экран. Вы можете проверить правильный ответ ниже   -  person AShavit    schedule 20.04.2015


Ответы (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, класс размера изменяется на компактный внутри самого всплывающего окна.

person Rory McKinnel    schedule 20.04.2015
comment
Благодарить! Оно работает. На самом деле я использовал классы размера, чтобы проверить, является ли VC компактным и регулярным ли представление, поскольку, если оба компактны, это означает, что он был представлен модально, а не как. if (self.traitCollection.horizontalSizeClass < self.presentingViewController.traitCollection.horizontalSizeClass) { // ... Its showing as per the form specification } else{ // ... Its showing as a modal full screen. } - person AShavit; 20.04.2015

Чистое решение 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 в альбомной ориентации.

person dfmuir    schedule 03.09.2015