【问题标题】:How to adjust super view 's height base on subview's size in XIB?如何根据 XIB 中的子视图大小调整 superview 的高度?
【发布时间】:2015-01-16 19:40:00
【问题描述】:

在 xcode 6 中,我为自定义视图创建了一个 xib(名为:ViewA,获得了红色背景色),并且 ViewA 的 xib 文件大小为 600*600,在 ViewA 中,我放置了一个子视图 labelB(获得了一个绿色背景颜色)在其中,并且labelB的numberOfLines = 0,所以labelB'height是可变的,我希望根据labelB的高度改变ViewA的高度(例如ViewA.bottom = labelB.bottom + 10),并且我已经固定了labelB的顶部,底部,尾随,导致ViewA,但它仍然不起作用!无论标签的高度是多少,ViewA的高度总是600。我怎样才能在自动布局中实现这个目标?谢谢

【问题讨论】:

标签: ios xcode interface-builder autolayout


【解决方案1】:

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

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

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

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

  4. 确保在应用任何约束之前将视图的 translatesAutoresizingMaskIntoConstraints 属性值更改为 NO

就是这样。您无需调用 sizeToFitsystemLayoutSizeFittingSize: 即可使其正常工作,只需加载您的视图并设置文本即可。系统布局引擎将为您进行计算以解决您的约束。 (如果有的话,您可能需要在 superview 上调用 setNeedsLayout...但这不是必需的。)

您可以查看原始答案here

【讨论】:

  • 感谢 Anuj :) 我终于找到了为什么 superview 的高度无法更改的问题,这是因为我没有将 nib 视图的 translatesAutoresizingMaskIntoConstraints 设置为 NO,所以看起来自动布局系统会根据我当前的 xib 大小生成一些约束。因此无法更改视图的大小。我认为检查 translatesAutoresizingMaskIntoConstraints 可以是要添加到您要完成的列表中的第 4 点。
  • 是的,这应该是第 4 点。我会编辑我的答案。我曾经使用 NSLayoutConstraints 进行 AutoLayout,它的语法根本不可读。我建议你使用Masonry。它会照顾一切,甚至会为您做view.translatesAutoresizingMaskIntoConstraints = NO
  • @ximmyxiao 拯救了我的一天...谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
相关资源
最近更新 更多