2015-06-21 2 views
0

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

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

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

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

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 
} 
+0

Удалось выяснить это? – ian

+0

@ian Я этого не сделал. – Joey

ответ

0

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

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

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

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

Другая часть протокола делегата предоставляет вам место для переноса popover в навигационном контроллере.

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

В ObjC я следующее:

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

Тогда существует несколько способов, вы можете получить кнопку Готово, чтобы показать. Можно проверить, находитесь ли вы в контроллере навигации и вставляете кнопку «Готово» в навигационную панель. FWIW, я использовал раскадровку с кнопкой Navigation Item и Right Bar, добавленной в контроллер popover view. Они не отображаются, если я не добавлю контроллер навигации.

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

popoverController?.barButtonItem = settingsButton 
popoverController?.delegate = self