表单表 iOS 8 约束与 iPhone 约束相同。

11

我的问题是,在 iOS 8 中,表单表格采用了“紧凑-宽度常规-高度”(即所有iPhone的限制条件)而不是“任何-任何”或“常规-宽度常规-高度”的限制条件。我在 iPhone 和 iPad 上有两种不同的设计,由于表单表格使用了 iPhone 的限制条件,我无法实现相同的设计。如果能帮忙解决这个问题,将不胜感激。

3个回答

9
从UIViewController类参考中可以看到:
在水平正常的环境下,这种呈现方式会将内容居中显示在屏幕上。内容区域的宽度和高度小于屏幕尺寸,并且在内容下方放置了一个调暗视图。如果设备处于横向方向并且键盘可见,则将视图位置向上调整以使其仍然可见。所有未覆盖的区域都会变暗,以防止用户与其交互。
在水平紧凑的环境下,此选项的行为与UIModalPresentationFullScreen相同。
由于iPad上的表单表格呈现方式是紧凑宽度和常规高度,因此在呈现表单表格时,您将获得这些值。
如果您不想使用默认的大小类,可以覆盖它们。
如果您的视图控制器是另一个视图控制器的子视图控制器,则可以使用setOverrideTraitCollection(_:forChildViewController:)并覆盖子控制器的大小类约束。
如果您的视图控制器不是子视图控制器,则实际上不应更改特质集,但是您可以使用此方法来改变它们。
最好的解决方案是设计您的视图控制器,使其在表单表格视图控制器呈现的默认(正确)大小约束下看起来合适。通常可以通过避免设置宽度约束并仅设置前导和尾随约束来实现这一点。

2
另一种解决方案是使用vc.presentationController.overrideTraitCollection。翻译成中文即为"覆盖控制器特征集合"。
    // in landscape mode, we want the horizontal traits to be the same as the main screen
    if ( UIScreen.mainScreen.traitCollection.horizontalSizeClass ==  UIUserInterfaceSizeClassRegular){

        //if you use UIModalPresentationFormSheet, the traits horizontal will be compact , even on iPad, so we have tell the presentationcontroller to force the horizontaltraits to regular
        vc.modalPresentationStyle=UIModalPresentationFormSheet;
        vc.presentationController.overrideTraitCollection = [UITraitCollection traitCollectionWithHorizontalSizeClass:UIUserInterfaceSizeClassRegular ];
        [_rootViewController presentViewController:vc animated:true completion:^{}];
}

1
在我的情况下,它在iOS 13.1模拟器中工作正常,但在iOS 13中不起作用。你遇到过这个问题吗? - Yogendra Patel

0

我找到了一种不同的方法来解决这个问题,针对呈现的视图控制器,例如不是子视图控制器的表单表。

我重写了viewWillLayoutSubviews,然后根据呈现的视图控制器的特征集进行布局。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    if let presenting = presentingViewController {
        updateLayout(forSizeClass: presenting.traitCollection.horizontalSizeClass)
    }
}

updateLayout(forSizeClass:) 是我们的函数,它可以执行我们需要支持特性环境的任何操作。

这种方法的好处是我们不需要显式地检查设备类型(.pad.phone),也不需要显式地设置视图大小的阈值(这可能会在未来发生变化)。这种方法本地支持 iPad 分屏视图,在呈现视图控制器达到 .compact 大小类时,允许您的布局回退到 iPhone 样式布局。

这里的主要假设是您的呈现视图控制器是全屏的。但对于表单表格来说,这通常是成立的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接