【问题标题】:Why does intrinsicContentSize for UIView always return (-1.0, -1.0)?为什么 UIView 的 intrinsicContentSize 总是返回 (-1.0, -1.0)?
【发布时间】:2019-09-28 15:39:28
【问题描述】:

具有正确自动布局的 UIView 未返回正确的内在内容大小。我得到 (-1.0, -1.0) 即使我可以看到它在故事板和应用程序运行时的大小都是正确的。

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

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

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

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

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

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

【问题讨论】:

标签: ios swift uiview autolayout


【解决方案1】:

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

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

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

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


你在评论中说:

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

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

我很好奇如何计算这个

啊,好的。但是你应该问那个。答案是:拨打systemLayoutSizeFittingSize

【讨论】:

  • 如果我有一个只有 Center X 和 Center Y 约束的 UIView 并且给定它有一些内容,我想知道自动布局运行后它的大小是多少。我认为这将是“内在内容大小”,因为它是基于内部妥协的元素的大小。看到这似乎是一个不正确的假设,我很好奇如何计算这个。 (如果需要,我可以覆盖 intrinsicContentSize。)
  • "并给出了一些内容"。如果它有一些具有内在内容大小和/或高度/宽度约束的内容/子视图(如 UILabel),那么它不是模棱两可的。我在一个示例项目中清楚地说明了这一点。也许我应该把它上传到 Github。
  • 好的,我收回我所说的歧义,但我的回答仍然正确:这与内在内容大小无关。
  • 谢谢!我非常感谢您对intrinsicContentSize 行为的澄清。我会给 systemLayoutFittingSize 一个镜头,然后返回结果。
  • systemLayoutSizeFitting 似乎完全符合我的需要。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2013-10-02
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多