内在尺寸与系统宽度/高度约束的区别是什么?

开始从弹簧和结构布局移动到自动布局,并对“内在尺寸”设置有一些疑问。

如果将某些视图的“内部大小”设置为“占位符”并放置一些宽度和高度值,则视图将不会缩放并保持固定大小。 但是如果我们将“内部大小”设置为“默认(系统定义)”,那么系统将在运行时根据需要决定和缩放视图。

但是,我们可以使用Ctrl + Drag为视图显式设置宽度和高度系统约束。 在这种情况下,将存在系统宽度和高度约束以及const占位符值。 我正在审查现有的代码,并试图理解它是一个错误,应该删除冗余系统宽度和高度约束或还有一些其他隐藏的逻辑。 但是,Xcode在运行时不会在控制台中显示任何警告等。 这是演示项目的打印屏幕:

在此处输入图像描述

当您将内在大小设置为“占位符”时,您告诉Xcode布局系统您的视图的大小取决于其内容(如标签可能取决于其文本内容)。 系统仅知道并维护其自身类型的具有内在大小的视图。 如果您希望在自己的视图中获得类似的体验,请将视图视为具有内在大小。 然后设置约束,就好像视图应该根据其内容增长或缩小一样。 最后,实现intrinsicContentSize方法来计算并返回正确的内容大小。 如果内容发生更改并且应执行新计算,则在视图上调用invalidateIntrinsicContentSize 。 根据您设置约束的方式,视图将增长和/或缩小,或者它将是静态的(就像您可以在标签上设置宽度和高度约束,并且它保持静态)。

如果您熟悉android中的wrap_content ,那么intrinsicContentSize与wrap_content相同。

包含内容的每个视图都可以计算其内在内容大小。 内在内容大小由每个UIView实例上的方法计算。 此方法返回CGSize实例

当Intrinsic size设置为Placeholder时,containerView根据其subView(containeeView)计算自己的高度

containerView根据其内部的内容增长或缩小。

– 设置视图的宽度和位置,而不是height -set view.intrinsicSize =占位符 – 在视图中放置标签-snap标签到视图的所有边框 – 不设置标签的高度(或设置高度为> =运算符。不= operator)-set label为lines = 0,lineBreak = WordWrap

根据内容大小,标签的高度会增大或缩小。 视图将根据标签高度增长或缩小高度。