Определите, как представлен контроллер представления

Я представляю контроллер представления модально с его UIModalPresentationStyle, настроенным на адаптивный стиль UIModalPresentationPopover. Этот стиль в горизонтально компактной среде (портрет iPhone) будет отображаться на весь экран. В ровной по горизонтали и компактной по вертикали среде (iPhone 6 Plus в альбомной ориентации) он будет отображаться на листе формы. А в обычной среде (iPad) он будет отображаться как всплывающее окно. Это желаемое поведение.

Мне нужно программно определить, как этот контроллер будет фактически отображаться — лист формы, полноэкранный режим или всплывающее окно. Как я могу определить это из представленного контроллера представления?

Причина в том, что мне нужно добавить кнопку «Готово» только в том случае, если она не находится во всплывающем окне. (Или скройте его, если он находится во всплывающем окне.)

Создание контроллера представления:

let viewController = ...
viewController.modalPresentationStyle = .Popover

let popoverController = viewController.popoverPresentationController
popoverController?.barButtonItem = settingsButton

presentViewController(viewController, animated: true, completion: nil)

Внутри viewController:

- (void)viewDidLoad {
    [super viewDidLoad];

    //self.modalPresentationStyle is Popover even in the case where it's presented over the full screen
    //self.popoverPresentationController is not nil even when presented full screen
}

person Jordan H    schedule 21.06.2015    source источник
comment
Вам удалось в этом разобраться?   -  person ian    schedule 13.10.2015


Ответы (1)


Я не владею Swift свободно, поэтому я попробую ответить без слишком большого количества плохого кода Swift.

Я считаю, что вы просто хотите сделать свой контроллер UIPopoverPresentationControllerDelegate, а затем реализовать:

optional func adaptivePresentationStyleForPresentationController(_ controller:
     UIPresentationController,
       traitCollection traitCollection: UITraitCollection) -> UIModalPresentationStyle

В этой функции вы можете вернуть желаемый стиль представления на основе traitCollection, переданного в функцию. (доступно после iOS 8.3) Это дает ВАМ контроль над выбором отображения, сделанным на основе traitCollection.

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

   optional func presentationController(_ controller: UIPresentationController,
viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController?

В Objc я делаю следующее:

UINavigationController *navController = [[UINavigationController alloc] 
    initWithRootViewController:controller.presentedViewController];
return navController;

Затем есть несколько способов, которыми вы можете отобразить кнопку «Готово». Один из них — проверить, находитесь ли вы внутри навигационного контроллера и вставляете ли кнопку «Готово» в панель навигации. FWIW, я использовал раскадровку с кнопкой «Навигация» и «Правая панель», добавленной в контроллер представления всплывающего окна. Они не отображаются, пока я не добавлю навигационный контроллер.

Не забудьте назначить свой контроллер в качестве делегата:

popoverController?.barButtonItem = settingsButton
popoverController?.delegate = self
person James    schedule 22.10.2015