Formsheet ios 8约束与iphones约束相同

时间:2014-11-27 03:29:20

标签: swift ios8 xcode6.1

我遇到这个问题,其中ios 8中的表单采用为“compact-width regular -height”(即所有iPhone约束)而不是“any-any”或“regular -width regular -height”设置的约束。 我有两种不同的iPhone和iPad设计,因为表格正在使用iPhone限制iam 不能达到同样的目的。任何有关这方面的帮助都是非常谨慎的

3 个答案:

答案 0 :(得分:8)

从UIViewController类引用:

  

在水平常规环境中,显示以屏幕为中心的内容的演示文稿样式。内容区域的宽度和高度小于屏幕尺寸,并且在内容下方放置调光视图。如果设备处于横向方向且键盘可见,则向上调整视图的位置以使视图保持可见。所有未覆盖的区域都会变暗以防止用户与其进行交互。

     

在水平紧凑的环境中,此选项与UIModalPresentationFullScreen的行为相同。

由于iPad上的表单演示文稿是紧凑的宽度和常规高度,因此这些是您在提交表单时获得的值。


如果您不想使用默认大小类,则可以覆盖它们。

如果您的视图控制器是另一个视图控制器的子视图控制器,您可以使用setOverrideTraitCollection(_:forChildViewController:)并覆盖子控制器的大小类约束。

如果您的视图控制器不是子视图控制器,您实际上不应该更改特征集合,但您可以using this hack执行此操作。


最佳解决方案是将视图控制器设计为适用于表单工作表视图控制器演示文稿的默认(正确)大小约束。您通常可以通过避免设置宽度约束并仅设置前导和尾随约束来实现此目的。

答案 1 :(得分:1)

对于找到的视图控制器(例如不是子视图控制器的表单),我找到了解决此问题的另一种方法。

我重写viewWillLayoutSubviews,然后根据当前视图控制器的特征集合进行布局。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

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

updateLayout(forSizeClass:)是我们的功能,它可以完成支持特质环境的所有工作。

此方法的好处是我们没有显式检查设备类型(.pad.phone),也没有显式地限制视图大小(将来可能会改变)。此方法本身支持iPad拆分视图,当当前视图控制器达到.compact尺寸类别时,允许您的布局退回到iPhone样式的布局。

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

答案 2 :(得分:1)

另一种解决方案是使用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:^{}];
}