简单的目标,但它演示了自动布局让我头疼的情况。我想要一个宽度为256pt的堆栈视图和一个基于布局的动态高度(我不应该手动指定高度)。 内部应该是图像视图大小为64pt x 64pt ,它也应该是水平居中以及受限制的8pt 来自superview的顶部。请注意,图像视图不是唯一的子视图,因此必须动态调整堆栈视图的高度。
自动布局现在告诉我堆栈视图的256pt宽度约束和图像的64pt宽度约束之间存在冲突,以及一些神秘的" leading = Image.leading"和" trailing = Image.trailing"我甚至无法删除或发现的冲突。
我是否错过了有关自动布局的内容?我希望所有逻辑都包含在接口构建器中,因此不需要代码。
运行Xcode 9.1
答案 0 :(得分:2)
没有什么可以混淆的。 iOS清楚地告诉你这个问题。
StackViews
根据子组件的大小获取大小(这称为隐式大小),除非在您的情况下手动覆盖,这是256pt。
因为stackView只是一个水平或垂直堆叠的多个childView的容器,现在因为你只添加了一个imageView,它会向它添加leading
和trailing
约束,这是绝对意义上的因为你在视图堆栈中添加了一个视图,现在堆栈视图应该做什么?将childView(在您的情况下为imageView
)拉伸到自己的大小。
但是你没有允许它,因为当你试图增加imageView的宽度时,你已经将宽度约束添加到imageView
,而imageView的约束不允许它。
因此,它抱怨说存在太多相互冲突的约束。多数民众赞成:)
一些神秘的“领先= Image.leading”和“尾随= Image.trailing“我甚至无法删除也找不到的冲突。
你无法删除它们,因为imageView是stackView中唯一的视图。因为只有一个子视图要堆叠,所以stackView将从左侧(前端)开始到右侧(尾随)。因为现在stackView有自己的宽度,它会尝试更改imageView的宽度以反映相同的宽度!但图像宽度约束可以防止它发生。
如果将imageView添加到stackView,您想要实现什么?如果stackView中只有一个视图,添加stackView没有任何意义。重新考虑你在做什么。
最后,当你在堆栈视图中只有一个childView时,添加水平中心没有任何意义(无论垂直/水平stackView)。