在子视图使用自动布局dynamic更改后调整superview的大小
我不能因为这个重新调整的超级观点的结局而爱上帝。
我有一个UIView *superview
4 UILabels
。 2作为其他2个头的function。
所有4个内容都是来自数据库的dynamic。
SizeToFit
vs SizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
传递UILayoutFittingCompressedSize
或UILayoutFittingExpandedSize
。
我以编程方式使用autolayout,并将superview高度设置为等于或大于虚拟数字。
在哪里以及如何使用这些SizeToFit
vs sizeThatFits:(CGSize)
vs UIView systemLayoutSizeFittingSize:
传递UILayoutFittingCompressedSize
或UILayoutFittingExpandedSize
。 我在这里阅读了很多技巧,但没有结果。
我是否需要重新计算特定于某处的超级视图的约束条件。 Maby在其控制器类中将高度设置为“@属性”并删除并读取它? 自动取款机我试图把所有的东西,然后一些。 仍然我得到相同大小的最终结果与虚拟高度和文字浮动外面。 即使在subview上设置clipsToBound之后。
我正在抓我的头发..帮助
如果您使用的是自动布局,那么您需要执行以下操作:
-
确保您没有为任何子视图添加固定的宽度和/或高度约束(取决于您要dynamicresize的维度)。 这个想法是让每个子视图的内在内容大小决定子视图的高度。
UILabel
s带有4个自动隐式约束,它们将会(小于所需的优先级)尝试将标签的框架保持在所需的精确大小以适应所有文本。 -
确保每个标签的边缘都严格地连接到彼此的边缘和它们的超级视图。 你要确保如果你想象其中一个标签越来越大,这将迫使其他标签腾出空间,最重要的是强制superview扩展。
-
只给superview添加约束来设置它的位置,而不是size(至less,不是你想要dynamic调整的尺寸)。 请记住,如果你正确设置内部约束,其大小将由所有子视图的大小决定,因为它的边以某种方式连接到它们的边。
而已。 你不需要调用sizeToFit
或systemLayoutSizeFittingSize:
为了得到这个工作,只需加载你的意见,并设置文本,应该是它。 系统布局引擎将为您解决您的约束做计算。 (如果有的话,你可能需要在setNeedsLayout
上调用setNeedsLayout
…但是这不是必需的。)
使用容器视图
在下面的例子中,我有一个30×30的图像,并且UILabel
小于包含占位符文本的视图。 我需要包含的视图至less与图像一样大,但是它需要包含多行文本。
在视觉格式中,内部容器看起来像这样:
H:|-(15.0)-[image(30.0)]-(15.0)-[label]-(15.0)-| V:|[image(30.0)]| V:|[label(>=30.0)]|
然后,设置包含视图以匹配标签的高度。 现在,包含的视图将与标签的大小相符。
正如@smileyborg在他的回答中指出的,将内容严格地连接到超级视图通知布局引擎,简单的容器视图应该导致它增长。
黄色alignment矩形
如果您想要黄色alignment矩形,请在您的scheme的运行参数列表中添加-UIViewShowAlignmentRects YES
。
通过在iOS 9中引入堆栈视图,这变得非常容易。在视图中使用堆栈视图来包含resize的所有内容,然后只需调用
view.setNeedsUpdateConstraints() view.updateConstraintsIfNeeded() view.setNeedsLayout() view.layoutIfNeeded()
改变你的内容后。 那么你可以通过打电话来获得新的尺寸
view.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
如果您需要计算视图所需的确切大小。
这几乎跟@smileyborg的答案,并带有一个具体的例子。
不会描述所有约束条件,而是与UI对象的高度计算有关。
- [标签]标签不能有固定的
height
限制,在这种情况下,AutoLayout不会调整标签的大小以适应文本,所以设置边缘限制是关键。 (绿色箭头) -
[子视图]步骤1和3非常容易遵循,但这一步可能会被误解。 和标签一样,子视图不能设置
height
约束。 所有子视图必须有top
约束集,忽略bottom
约束,这可以让你认为会在运行时触发不满足的约束exception,但是如果你为最后一个子视图设置bottom
约束,那么不会。 缺less这样做会打击布局。 (红色箭头) -
[Superview]根据需要设置所有约束,但要注意
height
限制。 为它指定一个随机值,但使其成为可选项,AutoLayout将精确设置高度以适应子视图。 (蓝色箭头)
这完美的工作,没有必要调用任何额外的系统布局更新方法。