【问题标题】:Basic Auto Layout - nested width and dynamic height基本自动布局 - 嵌套宽度和动态高度
【发布时间】:2017-11-16 11:39:54
【问题描述】:

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

Auto Layout 现在告诉我堆栈视图的 256pt 宽度约束和图像的 64pt 宽度约束之间存在冲突,以及一些神秘的“leading = Image.leading”和“trailing = Image.trailing”冲突我什至无法删除也找不到。

我是否遗漏了有关自动布局的内容?我希望所有逻辑都包含在界面构建器中,因此不需要任何代码。

运行 Xcode 9.1

Layout image

【问题讨论】:

  • 无论你试图实现什么都不符合 UIStackView 的属性,你可能不允许在 UIStackView 内设置约束以获取边距。

标签: ios autolayout


【解决方案1】:

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

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

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

但后来你不允许它,因为你现在向imageView 添加了宽度约束,当它试图增加 imageView 的宽度时,imageView 的约束不允许它。

因此它抱怨有太多冲突的约束。就是这样:)

一些神秘的“leading = Image.leading”和“trailing = Image.trailing”冲突,我什至无法删除也找不到。

你不能删除它们,因为 imageView 是 stackView 中唯一的视图。因为只有一个子视图要堆叠,stackView 将从左侧(前导)开始到右侧(尾随)。因为现在 stackView 有自己的宽度,它试图改变 imageView 的宽度以反映相同!但是图像宽度限制阻止了它的发生。

您想通过添加到 stackView 的 imageView 来实现什么。如果stackView中只有一个view,添加stackView没有任何意义。重新考虑你在做什么。

最后,当stackview中只有一个childView时,添加水平居中没有任何意义(无论stackView垂直/水平)。

【讨论】:

  • @Johan Svensson:如果有帮助,请考虑接受答案
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多