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

Ale*_*son 5 uiview ios autolayout swift

具有正确自动布局的 UIView 不会返回正确的内在内容大小。尽管我可以看到它在情节提要中和应用程序运行时的大小都正确,但我得到了 (-1.0, -1.0)。

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

我还尝试使用故事板创建一个新项目。我在视图中添加了一个 UIView (a) 并将其居中(X 和 Y)。我在我的 (a) 视图中添加了一个 UILabel 并约束左、右、上、下。我可以看到 (a) 视图大小正确。当我运行该应用程序时,我发现它的大小仍然正确。我的 (a) 视图返回 (-1.0, -1.0) 作为内在内容大小。

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

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

我真的不明白视图如何将其框架设置为等于其子元素的固有大小,同时没有固有的内容大小。

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

mat*_*att 6

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

这只是对“内在内容大小”的误解。普通的 UIView 没有(有意义的)内在内容大小。

固有内容大小是某些界面对象(例如 UILabel 和 UIButton)实现的属性,因此您不必给它们提供高度和宽度约束。这些是特殊的界面对象,包含文本(和/或,如果是按钮,则包含图像),并且可以调整自身大小以适应文本。

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


你在评论中说:

如果我有一个只有中心 X 和中心 Y 约束的 UIView,并且给定它有一些内容,我想知道自动布局运行后它的大小是多少

很好,但这不是其内在的内容大小。这是它的大小。如果您在视图控制器中,请实现didLayoutSubviews并查看该视图的bounds.size. 这就是你想要的尺寸。

我很好奇如何计算这个

喔好吧。但你应该问这个。答案是:打电话systemLayoutSizeFittingSize