0

我正在以模态方式展示一个视图控制器,并将其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)

在视图控制器内部:

- (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
}
4

1 回答 1

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
于 2015-10-22T21:12:10.080 回答