在XCode中使用Size Class的正确方法是什么?

时间:2016-04-07 21:00:51

标签: ios xcode autolayout size-classes

我在Any Width,Any Height size类中开始了一个项目,对于其中一个场景,有几个UI元素(超过10个)。最近我想改变Any With,Compact Height尺寸类(适用于横向的iPhone)的场景布局。我无法找到适当的方法来管理它。

最后,我必须删除Any Width,Any Height中的所有UI元素,然后创建该场景的所有元素的两个副本,一个用于Any Width,Compact Height,另一个用于Any Width, 常规高度。因此Any,Any中的场景实际上变成了空白。但我觉得这不应该是正确的方法。

以下是一个例子:

我开始使用任意宽度,任意高度,并放置两个标签(一个在另一个上面)以填充屏幕。

任何宽度,任何高度。约束集。

enter image description here

任何宽度,紧凑高度,具有任意宽度,任何高度

的约束

现在对于横向的iPhone,我想移动标签,使它们并排,所以首先,在XCode的底部,我改为wAny hCompact,然后拖动并调整标签的大小,使它们是侧面的旁边。在添加其他约束之前,它看起来如下所示。

请注意,“文档大纲”中突出显示的约束来自“任意宽度”,“任意高度”,它们全部应用于“任意宽度”,“紧凑高度”。

enter image description here

任何宽度,紧凑高度。从任意宽度,任何高度

卸载约束

所以我卸载了这些约束 enter image description here

任何宽度,紧凑高度。添加了自己的约束

然后我为当前大小类添加了约束,Any Width,Compact Height enter image description here

任何宽度,任何高度。现在没有约束,Xcode抛出错误和警告

回到Any Width,Any Height size类,由于我卸载了约束,因此不会应用约束。但如果我添加了约束,任何宽度,紧凑高度都会受到影响。 enter image description here

所以我安装了所有约束,从任意宽度,任意高度到任意宽度,常规高度。这将使项目运行,屏幕将在纵向和横向上正确显示。 enter image description here

但是,在Any Width,Any Height中,仍然没有约束,XCode会抛出警告

就像我说的那样,我最终删除了该场景的Any Width,Any Height中的所有UI元素,然后在Any Width,Compact Height和Any Width,Regular Height中创建了一个版本。还必须为每个人创建出口和行动。

每次我想使用另一个尺寸类时,如果不创建一组单独的UI元素(并且没有控制拖动以创建出口和动作),我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

为了实现您的目标,您需要管理两组约束。

Any,Any类的一个集合和Any,Compact类的另一个集合。

诀窍是确保在该类中专门卸载给定大小类所不需要的约束 - 我将在下面向您展示我的意思。

Any,Any尺寸中的约束条件为:

  • 标签1

    • 领先的空间到superview = 0
    • 尾随空格到superview = 0
    • 顶部空间到顶部布局指南= 0
    • 底部空格以标记2 = 0
    • 标签的等高2 = 0
  • 标签2

    • 领先的空间到superview = 0
    • 尾随空格到superview = 0
    • 底部空间到底部布局指南= 0
    • 标注1 = 0
    • 的顶部空间
    • 标签的等高1 = 0

您的标签1约束应如下所示,您的标签2约束类似:

Label 1 constraints

现在,选择Any,Compact类并调整两个标签位置并添加以下约束:

  • 标签1

    • 底部空间到底部布局指南= 0
    • label2的前沿到后沿= 0
    • 等于标签2的宽度
  • 标签2

    • 顶部空间到顶部布局指南= 0
    • label1的前沿到前沿= 0
    • 等于标签1的宽度

现在,通过双击约束,单击" +"关闭Any,Compact中不必要的约束。添加Any,Compact然后清除复选框,使其如下所示:

enter image description here

Any,Compact的不必要约束是:

  • 标签1

    • 追踪空间到superview
    • 标注2的底部空间
    • 标记为2的等高
  • 标签2

    • 领导空间到superview
    • 标注1的顶部空间
    • 标记为1的等高

现在,返回Any,Any课程并以同样的方式关闭Any,Any不必要的约束

enter image description here

Any,Any的不必要的约束是:

  • 标签1

    • 尾随空格标签2
    • 底部空间到底部布局指南
    • 等于标签2的宽度
  • 标签2

    • 标注1的领先空间
    • 顶部空间到顶部布局指南
    • 等于标签1的宽度

现在,您应该可以在Any,AnyAny, Compact之间切换,并让标签移到正确的位置。

我已在此处上传了具有相应约束的故事板:https://gist.github.com/paulw11/f1b0faa229b152f1c53dadefcf9e0885

更新:我刚刚注意到您的标签之间的空格不是0,但您可以调整前导/后退&根据需要进行上/下限制。