AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?
Posted
技术标签:
【中文标题】AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?【英文标题】:AutoLayout: how to constrain UIView to be no taller than the height needed to contain all its subviews? 【发布时间】:2015-12-10 22:39:34 【问题描述】:关于 SO 的一些答案似乎可以解决相同的问题,例如 this one。但是,这些都不起作用。
我们的目标是使用 AutoLayout 和 Storyboard 创建一个 UIView,称之为parentView
,它的高度足以容纳它的子视图,而且不会更高。
这可以很容易地在代码中完成,但目标是在 Storyboard 中使用 AutoLayout 约束完成所有操作,而无需指定静态高度(例如,假设其中一个子视图是 UILabel,因此 parentView
需要如果 UILabel 的高度因为长文本而增加,则相应地增加)。
这可能吗?
【问题讨论】:
我们是否假设可以有多个子视图? 这是绝对可能的,可以通过正确设置约束来实现:) @HaydenHolligan 是的,假设有多个子视图! 【参考方案1】:这实际上可以通过添加约束而不是添加约束来实现!
将一个新的View
拖到超级视图中并给它两个约束:中心 X 和中心 Y。拖动一些视图/标签并将它们添加到 View
。
为了使其工作,内部的子视图必须对 View
的前导/尾随/顶部/底部有约束,将所有内容组合在一起。这“定义”了View's
宽度和高度的约束,因此 XCode 不会生你的气。
就是这样。 Example project.
编辑:视图和约束的图像
【讨论】:
感谢将下载示例项目,但对于可能没有 Dropbox 的未来读者,当您说drag a new view into the superview
时,是“新视图”parentView
还是“超级视图”?如果是前者,那试过了还是不行?
新视图是来自对象库的字面新“视图”。我将超级视图作为视图控制器的主视图。我编辑了答案以进行澄清。
好的,所以“新视图”在问题中被称为parentView
。谢谢!您的方法有效(在示例项目中测试),但不确定为什么它不适合我们。 Xcode 继续抱怨parentView
(或新视图)需要一个高度,即使我们已经给了它Center X
和Center Y
约束。尽管如此,仍会将其标记为正确。
很高兴为您提供帮助!它可能与parentView
中的子视图的约束有关。子视图通过前导/尾随/顶部/底部约束“定义”parentView
的高度和宽度。
是的,这就是问题所在。我们为其中一个子视图使用了“Center Y”,但我们不得不使用顶部和底部约束。所以对于未来的读者来说,诀窍是确保每个子视图都使用顶部/底部/前导/尾随约束。不能使用“中心 X”或“中心 Y”。以上是关于AutoLayout:如何将 UIView 限制为不高于包含其所有子视图所需的高度?的主要内容,如果未能解决你的问题,请参考以下文章
Autolayout 将 UIView 放在边距和另一个 UIView 之间
如何使用 AutoLayout 配置视图宽度固定宽度和可变高度
如何使用 Autolayout 在不同设备上保持 UIView 比例?