基本自动布局 - 嵌套宽度和动态高度

时间:2017-11-16 11:39:54

标签: ios autolayout

简单的目标,但它演示了自动布局让我头疼的情况。我想要一个宽度为256pt的堆栈视图和一个基于布局的动态高度(我不应该手动指定高度)。 内部应该是图像视图大小为64pt x 64pt ,它也应该是水平居中以及受限制的8pt 来自superview的顶部。请注意,图像视图不是唯一的子视图,因此必须动态调整堆栈视图的高度。

自动布局现在告诉我堆栈视图的256pt宽度约束和图像的64pt宽度约束之间存在冲突,以及一些神秘的" leading = Image.leading"和" trailing = Image.trailing"我甚至无法删除或发现的冲突。

我是否错过了有关自动布局的内容?我希望所有逻辑都包含在接口构建器中,因此不需要代码。

运行Xcode 9.1

Layout image

1 个答案:

答案 0 :(得分:2)

没有什么可以混淆的。 iOS清楚地告诉你这个问题。

StackViews根据子组件的大小获取大小(这称为隐式大小),除非在您的情况下手动覆盖,这是256pt。

因为stackView只是一个水平或垂直堆叠的多个childView的容器,现在因为你只添加了一个imageView,它会向它添加leadingtrailing约束,这是绝对意义上的因为你在视图堆栈中添加了一个视图,现在堆栈视图应该做什么?将childView(在您的情况下为imageView)拉伸到自己的大小。

但是你没有允许它,因为当你试图增加imageView的宽度时,你已经将宽度约束添加到imageView,而imageView的约束不允许它。

因此,它抱怨说存在太多相互冲突的约束。多数民众赞成:)

  

一些神秘的“领先= Image.leading”和“尾随=   Image.trailing“我甚至无法删除也找不到的冲突。

你无法删除它们,因为imageView是stackView中唯一的视图。因为只有一个子视图要堆叠,所以stackView将从左侧(前端)开始到右侧(尾随)。因为现在stackView有自己的宽度,它会尝试更改imageView的宽度以反映相同的宽度!但图像宽度约束可以防止它发生。

如果将imageView添加到stackView,您想要实现什么?如果stackView中只有一个视图,添加stackView没有任何意义。重新考虑你在做什么。

最后,当你在堆栈视图中只有一个childView时,添加水平中心没有任何意义(无论垂直/水平stackView)。