如何在XIB中根据子视图的大小调整超级视图的高度?

How to adjust super view 's height base on subview's size in XIB?

提问人:ximmyxiao 提问时间:11/19/2014 更新时间:11/24/2014 访问量:11562

问:

在 xcode 6 中,我为自定义视图(命名为:ViewA,得到一个红色背景色)创建一个 xib,而 ViewA 的 xib 得到一个文件大小为 600*600,在 ViewA 中,我在其中放置了一个子视图标签 B(得到一个绿色背景色),并且 labelB 的 numberOfLines = 0 ,所以 labelB'height 是可变的,我希望 ViewA 的高度根据 labelB 的高度改变(例如 ViewA.bottom = labelB.bottom + 10), 并且我已经将标签 B 的顶部、底部、尾随、指向 ViewA,但它仍然不起作用,ViewA 的高度始终为 600,无论标签的高度是什么。如何在自动布局中实现此目标?谢谢

enter image description here

iOS Xcode 界面生成器 自动布局

答:

8赞 Anuj Rajput 11/21/2014 #1

使用自动布局,您需要执行以下操作:

  1. 确保您没有向任何子视图添加固定的宽度和/或高度约束(具体取决于您要动态调整大小的尺寸)。这个想法是让每个子视图的内在内容大小决定子视图的高度。带有 4 个自动隐式约束,这些约束将(优先级小于 Required)尝试将标签的框架保持在适合所有文本所需的确切大小。UILabel

  2. 确保每个标签的边缘都刚性地连接到彼此的边缘及其上视图(具有必需的优先级约束)。你要确保,如果你想象其中一个标签的大小越来越大,这将迫使其他标签为它腾出空间,最重要的是,也会迫使超级视图也扩大。

  3. 仅向上视图添加约束以设置其位置,而不是大小(至少,不是您希望其动态调整大小的尺寸)。请记住,如果正确设置了内部约束,则其大小将由所有子视图的大小决定,因为它的边缘以某种方式连接到它们的边缘。

  4. 请确保在应用任何约束之前更改为视图的属性值。translatesAutoresizingMaskIntoConstraintsNO

就是这样。你不需要调用或让它工作,只需加载你的视图并设置文本,就应该就是这样了。系统布局引擎将为您进行计算以解决约束条件。(如果有的话,您可能需要调用 superview...但这不应该是必需的。sizeToFitsystemLayoutSizeFittingSize:setNeedsLayout

您可以在此处查看原始答案

评论

0赞 ximmyxiao 11/24/2014
谢谢 Anuj:) 我发现了为什么最后无法更改超视图高度的问题,这是因为我没有将笔尖视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO,所以似乎自动布局系统会根据我当前的 xib 大小生成一些约束。所以视图的大小是不能改变的。我认为检查translatesAutoresizingMaskIntoConstraints可以是要添加到列表中的第 4 点。
1赞 Anuj Rajput 11/24/2014
是的,这应该是这里的第 4 点。我会编辑我的答案。我曾经使用 NSLayoutConstraints 进行 AutoLayout,它的语法根本不可读。我建议你使用砌体。它会照顾好一切,甚至会为你做view.translatesAutoresizingMaskIntoConstraints = NO
0赞 KudoCC 1/27/2017
@ximmyxiao 拯救了我的一天......谢谢