确定视图控制器的呈现方式

时间:2015-06-21 21:16:19

标签: ios uimodalpresentationstyle adaptive-ui

我以模态方式呈现视图控制器,其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
}

1 个答案:

答案 0 :(得分:0)

我不是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