【问题标题】:Determine how a view controller is being presented确定视图控制器的呈现方式
【发布时间】:2015-09-07 06:46:54
【问题描述】:

我正在展示一个视图控制器,其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
}

【问题讨论】:

  • 你解决了吗?

标签: ios uimodalpresentationstyle adaptive-ui


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2013-04-15
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多