Ios 固有尺寸与系统宽度/高度约束的区别是什么?

Ios 固有尺寸与系统宽度/高度约束的区别是什么?,ios,objective-c,autolayout,Ios,Objective C,Autolayout,开始从弹簧和结构布局移动到自动布局,并对“固有大小”设置有一些疑问 如果将某些视图的“固有大小”设置为“占位符”,并放置一些宽度和高度值,则视图将不会缩放,并保持固定大小。但是,如果我们将“内在大小”设置为“默认(系统定义)”,那么系统将在运行时决定并缩放视图(如果需要) 但是,我们可以使用Ctrl+Drag显式地为视图设置宽度和高度系统约束。在这种情况下,将存在系统宽度和高度约束以及常量占位符值。我正在检查现有的代码,试图了解它是一个bug,应该删除冗余的系统宽度和高度限制,还是存在其他隐藏的

开始从弹簧和结构布局移动到自动布局,并对“固有大小”设置有一些疑问

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

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


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

如果您熟悉android中的
wrap\u content
intrinsicContentSize
与wrap\u内容相同。

包含内容的每个视图都可以计算其内部内容大小。内在内容大小由每个UIView实例上的方法计算。当内在大小设置为占位符时,此方法返回CGSize实例,containerView根据其子视图(containeeView)计算其自身高度

containerView根据其内部的内容而增长或收缩

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

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

Hmm,使用自定义宽度和高度设置“占位符”不会根据UILabel的内容(“取决于其内容”)缩放UILabel。如果添加宽度和高度约束,它将不会缩放标签。我刚刚创建了一个新项目,并添加了一个具有更大框架的标签。然后设置“占位符”,并在宽度和高度复选框中选择“无”。什么也没发生,标签也没有调整大小以适应其内容。我没有通过设置任何约束。如果不添加任何约束(如从边到superview的最小间距),那么Xcode会添加硬编码约束,其中还包括宽度和高度。尝试将左空间约束添加到superview,并将顶部空间约束添加到superview(通过按住ctrl键从视图拖动到superview)。您将看到Xcode告诉您标签对于其内容来说太大了。您不应该为标签设置占位符的固有大小,系统熟悉它们的工作方式并正确推断。太棒了。使用MyCustomView创建了新项目,并在MyCustomView类中重写了intrinsicContentSize。然后添加了“占位符”和宽度和高度,瞧。调用了intrinsicContentSize并调整了MyCustomView的大小。谢谢