22

那种经典的 Springs 和 Struts,又名“Anchor and Align”或“Autosizing Masks”是我理解的唯一一种调整大小管理。然而,在 XCode 4.6 中,使用 iOS 6 中引入的约束的“自动布局”是默认设置,它使某些简单的事情变得更难,同时让整个世界的新安排成为可能,一旦你学会了如何。 (需要明确的是,一些用户可能只关心在不与自动布局战斗的情况下获得一个简单的视图,因此马特早期提出了一种解决方法,即关闭自动布局,如下所示)

iOS 6 Layout Constraints,Interface Builder系统的编辑约束,我不懂。

在此处输入图像描述

XCode Interface Builder 会自动创建约束(例如在视图的边缘),它似乎以我理解的方式运行。

我不明白为什么在此处显示的 .xib 中以及在此处可用为什么我不能让绿色和洋红色区域保持不变的边界(它们之间的白色区域)不会变厚也不会变薄,无论视图大小发生什么变化。

这意味着我需要绿色区域不要垂直调整大小而只调整水平大小,但它坚持将自己锚定到表单的底部,虽然再次从新的空白笔尖开始,但会恢复界面构建器,因此它会注意到相邻的再次绿色和洋红色视图,一旦界面构建器变得“愚蠢”,它坚持只根据其与父视图底部边缘的距离定义绿色视图的底部边缘,并且不会(对于任何数量的摆弄)否则使用仅仅是拖放操作。我还尝试了 Pin 命令,但没有找到有效的 pin 命令。

与界面构建器菜单或拖放进行任何斗争似乎都不足以让它摆脱其中一个限制。我不知道我应该做什么。删除约束?如何?据我所知,无论是从 IB Objects 窗格还是从 Utilities -> Size 检查器,都无法删除约束。有一个删除选项,但是当您单击约束区域中的“齿轮”图标按钮时,它在出现的下拉菜单中显示为灰色。

理想情况下,如果绿色区域随着视图变宽而调整大小,而不是随着它变高或变短,我会喜欢它。我认为这在其他所有工具中都很明显,但在 XCode+Autolayout 中,它要么根本不调整大小,要么在所有四个方向上调整大小。我无法删除或移除正在做我不想做的事情的约束。您是否必须对另一个视图内的每个视图有四个约束?

(更新 1:您不能删除任何会导致不明确或未指定布局的约束。)

(更新 2:有时如果 uiview 窗格不会对齐到同级,删除该 uiview 并再次尝试将允许它自然地“对齐”到同级,并且约束将相对于同级视图对象而不是父母。)

(更新 3:Matt 删除了他的解决方法,我在下面复制了它。)

对于那些一开始就不想使用 Autolayout 而只想要旧弹簧和支柱的人的解决方法:

第 1 步:关闭自动布局:

在此处输入图像描述

第 2 步:选择正确的自动调整大小蒙版:

在此处输入图像描述

4

2 回答 2

12

在界面构建器中编辑约束的关键是一旦将任何内容添加到视图中,就永远不要拖放任何内容。通过编辑约束来移动和排列事物。使用固定菜单创建新的约束。一旦添加了足够的新约束以明确替换自动添加的系统约束,您就可以删除不需要的约束。

在您的情况下,我创建了以下约束:

在此处输入图像描述

我将您的视图重命名为“绿色”和“洋红色”,以使文档导航器中的内容更清晰。我所做的是:

  • 固定视图之间的垂直间距
  • 将每个视图固定到左侧和右侧
  • 将顶视图固定到设定的高度和距父视图顶部的设定距离
  • 将底部视图的底部固定到超级视图的底部。

我认为这为您提供了您想要的布局。如果您想阅读更多内容,我已经在这里写了非常详细的内容。

于 2013-02-26T20:46:44.380 回答
2

如果您不想关闭新的 iOS6 自动布局模式,这就是答案。

如果顶层视图和所有子级视图的视图模式是 Scale to Fill,则在这种情况下使用锚模式“小于或等于”,因为您无法删除此约束。这两个彩色视图没有存储在笔尖中,因为它们具有大小(宽度、高度)或位置(左上角),而是存储有表示其布局的约束。布局“小于或等于”而不是“等于”可以通过单击上面的方块来访问,然后出现四个约束线,选择从您选择的控件的下边缘到底部的底部的约束线视图,并将类型从等于更改为小于或等于。

在此处输入图像描述

如果视图模式不是 Scale to fill,则需要进行其他约束更改。这种多面设计比旧的“弹簧和支柱”更灵活,但学习起来并不那么简单。

您可以使用的更明显的模式是在两个对象之间获得约束。为什么这如此困难(有时我可以做到,有时我不能)我仍然不知道。

这是一个示例,当我能够让约束出现在两个对象之间而不是从该对象到其父视图时,但是在这种情况下,我是否能够始终让 Interface Builder 进行合作将是一种更直观的方式创建顶部正方形未锚定到整个视图高度的情况:

在此处输入图像描述

如果上面的颜色视图有一个锚点到它下面的视图,这绝对意味着反向约束不能针对同一个视图,否则就会存在歧义或“循环推理”的情况。因此,我们可以让 A 依赖于 B,但不能让 B 同时依赖于 A。所以在这种情况下,约束被切换为依赖于视图的绝对高度或宽度。在我发现的这种特殊情况下,似乎需要大量的试验和错误来重新创建以前可以非常直观地完成的事情,然后再进行改进。

最后,我发现当您最终遇到额外的约束时,上面的说明似乎不起作用,而当您最不期望它们时,它们会神奇地添加。非常巧妙地,您应该看到两行而不是一行,如下所示:

在此处输入图像描述

只需将约束从等于更改为小于或等于,我就可以让 Interface Builder 继续添加越来越多的重复约束。我相信这是 XCode 4.6 中界面构建器中的一个错误,并且由于布局约束是 CococaTouch 中相对较新的部分,我并不惊讶界面构建器支持在您拖动和移动项目时自动创建约束,这是错误的。

于 2013-02-26T17:38:25.357 回答