【发布时间】:2010-10-25 15:48:24
【问题描述】:
这个方法的签名是:
- (CGSize)sizeThatFits:(CGSize)size
我不明白 size 参数的用途。 Apple 的documentation 声明它是“接收器的当前尺寸”。
但是接收器大概知道它当前的大小。那么为什么需要传入呢?
当我实验性地传入其他值时,该方法似乎仍然使用接收器的当前大小。
谁能解释一下?有没有什么情况下这个参数很重要?
【问题讨论】:
这个方法的签名是:
- (CGSize)sizeThatFits:(CGSize)size
我不明白 size 参数的用途。 Apple 的documentation 声明它是“接收器的当前尺寸”。
但是接收器大概知道它当前的大小。那么为什么需要传入呢?
当我实验性地传入其他值时,该方法似乎仍然使用接收器的当前大小。
谁能解释一下?有没有什么情况下这个参数很重要?
【问题讨论】:
首先,这种方法是 AppKit 遗留的(不是这个词的负面含义)。
是的,任何视图在任何给定时刻都有一些当前大小,并且可以从 bounds 属性中检索它。但是当最佳尺寸取决于非完全静态因素时,布局过程中会出现一些棘手的情况。以文本标签为例。它可以在一条或多条线中流动,并且线的数量可能取决于最大允许宽度。因此,一个可能的 UILabel 实现可以从传递给 sizeThatFits: 的 CGSize 的宽度得出其边界大小,在这种情况下,该大小实际上不是接收器的当前大小,而是某个期望/限制大小。
因此,任何 UIView 子类都可以实现 -sizeThatFits:,因为它认为合适(双关语),甚至可以随意忽略 size 参数。大多数情况下,当我必须实现此方法时,我会忽略它,因为我可以从视图的内部状态计算它,但在更复杂的场景中,您可能需要使用 size 参数来提示自己布局中的某些限制。
【讨论】:
sizeToFit的默认实现调用sizeThatFits:,传递self.bounds.size。
不仅仅是接收器的大小,还有你想要填充的潜在大小。结果是视图认为对于给定输入 size 最能显示其内容的大小。
默认行为是简单地返回 size 参数(即适合默认视图的大小就是您给它的大小)- 所以是的,这个参数在默认情况下很重要。
子类可以使用此方法强制执行 width==height 或其他类似的约束。
【讨论】: