【问题标题】:iPhone -- the input parameter to UIView's sizeThatFits methodiPhone -- UIView 的 sizeThatFits 方法的输入参数
【发布时间】:2010-10-25 15:48:24
【问题描述】:

这个方法的签名是:

- (CGSize)sizeThatFits:(CGSize)size

我不明白 size 参数的用途。 Apple 的documentation 声明它是“接收器的当前尺寸”。

但是接收器大概知道它当前的大小。那么为什么需要传入呢?

当我实验性地传入其他值时,该方法似乎仍然使用接收器的当前大小。

谁能解释一下?有没有什么情况下这个参数很重要?

【问题讨论】:

    标签: iphone uiview


    【解决方案1】:

    首先,这种方法是 AppKit 遗留的(不是​​这个词的负面含义)。

    是的,任何视图在任何给定时刻都有一些当前大小,并且可以从 bounds 属性中检索它。但是当最佳尺寸取决于非完全静态因素时,布局过程中会出现一些棘手的情况。以文本标签为例。它可以在一条或多条线中流动,并且线的数量可能取决于最大允许宽度。因此,一个可能的 UILabel 实现可以从传递给 sizeThatFits: 的 CGSize 的宽度得出其边界大小,在这种情况下,该大小实际上不是接收器的当前大小,而是某个期望/限制大小。

    因此,任何 UIView 子类都可以实现 -sizeThatFits:,因为它认为合适(双关语),甚至可以随意忽略 size 参数。大多数情况下,当我必须实现此方法时,我会忽略它,因为我可以从视图的内部状态计算它,但在更复杂的场景中,您可能需要使用 size 参数来提示自己布局中的某些限制。

    【讨论】:

    • 换句话说,当文档说参数是接收器的大小而实际上是父母希望孩子使用的大小时,文档是错误的?我当然是这样写代码的,但我想确认一下你是不是这个意思。
    • 有一点是肯定的,sizeToFit的默认实现调用sizeThatFits:,传递self.bounds.size。
    • 哦,我不知道。由于它没有记录,我通过一个类别在 UIView 上定义了 saneSizeToFit,该类别调用具有明确定义的尺寸的 sizeThatFits :)
    • “首先,这种方法是 AppKit 遗留的”我不认为这是真的。 NSView(我倾向于认为它是 UIView 的前身)没有定义这个方法。否则,我同意 Costique 的评估。
    【解决方案2】:

    不仅仅是接收器的大小,还有你想要填充的潜在大小。结果是视图认为对于给定输入 size 最能显示其内容的大小。

    默认行为是简单地返回 size 参数(即适合默认视图的大小就是您给它的大小)- 所以是的,这个参数在默认情况下很重要。

    子类可以使用此方法强制执行 width==height 或其他类似的约束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多