【问题标题】:Rigid Constraints vs. `-intrinsicContentSize`刚性约束与`-intrinsicContentSize`
【发布时间】:2015-09-21 15:45:20
【问题描述】:

所以我最近正在创建 Apple calls a leaf-level view(一个按钮),所以我按照 Apple 的文档来实现 -intrinsicContentSize 并且一切正常(尽管代码感觉有点奇怪 - 我在 -updateConstraints 方法中设置了约束定位子视图,以及 -intrinsicContentSize 方法中的代码来计算总大小应该是多少;感觉就像我向自动布局系统提供了重复的信息)。

但是,我也遇到了 post on here 声称使用刚性约束而不是使用 -intrinsicContentSize,然后容器视图将自动调整大小以适应它包含的视图。我也实现了这一点,并获得了与上面相同的结果,但是这次我不觉得我在复制发送的信息(我只是发送了直接约束)。请注意,我将上述帖子中描述的视图视为所谓的叶级视图,因为它听起来不像会添加任何其他视图。

根据里面的内容调整容器视图大小的哪种实现是正确的方法?


我目前倾向于第二种方法,因为我认为我不应该发送重复的信息,但是 Apple 的文档另有说明(再说一次,Apple 的文档有时可能有点令人困惑/误导)。


关于我的具体情况的旁注,重要的是:我的按钮中有两个子视图,一个是图像,另一个是标签。图像从标签中获取它的大小,然后从图像中获取整个按钮(因此间接地,大小完全来自标签)。

【问题讨论】:

  • 如果您的视图有子视图,则它不是叶级视图。
  • @KenThomases 公平点 - 我可以轻松地使用层(这只是从 UIKit 中去除非叶子并将其放入 QuartzCore,或使用 -drawRect 显示我的内容),但我的重点'我问保持关注......
  • @KenThomases 另外,作为记录,Apple 使用 button 作为叶级视图的示例,这意味着 UIButton 是叶级视图,但在 UIButton 的文档有一个明显的UILabel(实际上是UIButtonLabel),用于显示文本(这是一个子视图)
  • 这些文档最初是为 OS X 编写的,从提到的 NSView 和屏幕截图中可以看出这一点。在 OS X 上,按钮不是根据子视图实现的。不过,更重要的是,我的观点是-intrinsicContentSize 的大小是视图及其“内容”固有的,而不是外在的(源自其他视图或其与它们的关系)。您的实现本质上与子视图的内部约束是多余的,这一事实意味着它不合适。
  • @KenThomases 这些都是公平的观点,但我对如何在 iOS 上完成这一点很感兴趣——当然我可以尝试遵循你概述的范式,但视图在两个平台上的操作方式是完全不同,因此这使我认为使用在 OSX 上使用的方法可能不是解决此问题的正确方法。从某种意义上说,我正在创建的这个按钮确实具有固有大小,我希望它根据按钮内的文本具有一定的大小 - 为了方便起见,我只是使用子视图(或子层),因为它看起来是正确的在 iOS 中。如果是这种情况,我应该使用-drawRect 吗?

标签: ios autolayout


【解决方案1】:

您的按钮视图应具有基于标签和图像的内部约束。这些应该足以给它正确的大小。您不需要为此实现 intrinsicContentSize 。

按钮的超级视图不知道也不应该关心按钮内部发生了什么。您不直接引用内在内容大小,布局系统会这样做,如果您的按钮具有正确的内部约束,则没有必要。

固有内容大小允许视图根据其显示内容(例如标签中的文本)将其大小表示为视图层次结构的最底部。上面的一切都是基于约束的。

你也可以使用它来允许一个带有非自动布局子视图的视图参与自动布局,但这会导致大量重复的帧计算代码。

【讨论】:

  • 我要添加的一件事是按钮应该以适当的方式将设置在其上的内容拥抱和抗压缩优先级传播到子视图,以便“客户端”获得适当的行为。
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多