1

在 iPhone 6+ 上模态显示 ViewController,其UIModalPresentationFormSheet打开方式根据方向不同。

在纵向模式下,它看起来像普通的 Modal(与较小的 iPhone 相同)。但在横向模式下,它以表单形式打开(类似于 iPad)。

我如何以编程方式告诉实际使用了什么状态(在 VC 的生命周期中的任何地方)。

4

2 回答 2

2

当控制器的尺寸等级具有常规宽度时,控制器显示为表单。

因此,在横向的 iPhone 6+ 或任何方向的 iPad 上,水平尺寸等级是常规的,并且表单显示小于全屏宽度。

您可以使用以下方法在控制器中对此进行测试:

if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) {
  // ... Its showing as per the form specification
}
else{
  // ... Its showing as a modal full screen.
}

self如果从其他地方调用,则替换为控制器的变量。

这也涵盖了您可能使用弹出框的情况,因为当您在 iPad 上使用弹出框时,尺寸等级会在弹出框本身内更改为紧凑。

于 2015-04-20T13:39:13.233 回答
2

下面是一个干净的 Swift 解决方案。添加 isBeingPresentedInFormSheet 方法的 UIViewController 扩展。

extension UIViewController {
    func isBeingPresentedInFormSheet() -> Bool {
        if let presentingViewController = presentingViewController {
            return traitCollection.horizontalSizeClass == .Compact && presentingViewController.traitCollection.horizontalSizeClass == .Regular
        }
        return false
    }
}

如果视图控制器当前正在表单中显示,则此方法返回 true。

根据我的经验,这发生在

modalPresentationStyle = .FormSheet

并且设备是横向的 iPad 或 iPhone 6 Plus。

于 2015-09-03T20:12:24.710 回答