为什么 UIView 的 intrinsicContentSize 总是 return (-1.0, -1.0)?

Why does intrinsicContentSize for UIView always return (-1.0, -1.0)?

具有正确自动布局的 UIView 未返回正确的内部内容大小。我得到 (-1.0, -1.0) 即使我可以看到它在情节提要中和应用程序 运行s.

中的大小都正确

我尝试创建一个 Playground,它创建一个 UIView (a) 和一个 UILabel。 我将标签添加为 (a) 的子视图并设置左、右、上、下约束。 我还设置了一些文本并验证了我的标签具有正确的固有尺寸(确实如此)。 我 (a) 对内在内容大小的看法 returns (-1.0, -1.0)。

我也试过用故事板创建一个新项目。 我在我的视图中添加了一个 UIView (a) 并将其居中(X 和 Y)。 我在我的 (a) 视图中添加了一个 UILabel 并限制了左、右、上、下。 我可以看到 (a) 视图大小正确。当我 运行 应用程序时,我发现它的大小仍然合适。 我 (a) 对内在内容大小的看法 returns (-1.0, -1.0)。

考虑到 UIView 根据其固有内容大小(即子视图和相关约束)进行布局,我觉得这非常奇怪。

假设我的标签约束到我的 (a) 视图的边缘都是 0 的距离,那么我希望我的 (a) 视图的内在内容大小等于我的标签框架的大小(这是基于标签的固有大小,但这有点没有实际意义。

我真的不明白视图如何将其框架设置为其子元素的固有大小而不具有固有内容大小。

((a) 的框架查看 returns 正确的大小,但这并没有真正回答我的问题。另外 - 它对我的特定情况没有帮助,但这超出了范围这个问题。)

I find this extremely strange considering that the UIView does layout according to its intrinsic content size (i.e. the subviews and associated constraints).

这只是对"intrinsic content size"的误解。普通的 UIView 没有(有意义的)固有内容大小。

固有内容大小是某些界面对象(例如 UILabel 和 UIButton)实现的 属性,因此您不必为它们设置高度和宽度限制。这些是特殊的界面对象,包含 text(and/or,在按钮的情况下,是图像),并且可以调整自己的大小以适应它。

你的 UIView 不是那样的,基本上根本没有实现固有的内容大小。可以编写一个实现固有内容大小的 UIView 子类,其行为类似于 UILabel 或 UIButton;但你还没有这样做。


您在评论中说:

If I have a UIView with only a Center X and Center Y constraint and given it has some contents, I would like to know what its size is after autolayout operates

很好,但这不是其固有的内容大小。就是它的尺寸。如果您在视图控制器中,请执行 didLayoutSubviews 并查看此视图​​的 bounds.size。这就是您想要的尺码。

I'm curious how I could calculate this

啊,好的。但是你应该问那个。答案是:调用systemLayoutSizeFittingSize.