我有一个具有以下配置的单行 UILabel:
let label = UILabel()
label.text = "Lorem ipsum dolor sit amet"
label.numberOfLines = 1
sizeThatFits(size)
时,结果总是宽度较大的尺寸。
let labelSize = label.sizeThatFits(CGSize(width: 30, height: UILabel.noIntrinsicMetric))
// labelSize.width > 30
不应该
sizeThatFits()
返回小于或等于拟合尺寸的尺寸吗?
建议的答案都没有澄清这个问题。
textRect(forBounds:limitedToNumberOfLines:)
返回零宽度,而 systemLayoutSizeFitting()
返回与 sizeThatFits()
相同的大小。在任何建议的答案中都没有可以使用的其他解决方法。
来自苹果的文档:
讨论
此方法的默认实现返回视图的现有大小。子类可以重写此方法,以根据任何子视图所需的布局返回自定义值。例如, UISwitch 对象返回一个固定大小值,表示切换视图的标准大小,而 UIImageView 对象返回当前显示的图像的大小。
此方法不会调整接收器的大小。
当我们这样做时:
let label = UILabel()
label.text = "Lorem ipsum dolor sit amet"
label.numberOfLines = 1
let sz = label.sizeThatFits(.init(width: 30.0, height: UILabel.noIntrinsicMetric))
UIKit 说:“嘿视图(标签),你的大小是多少?” 视图(标签)返回其 .intrinsicContentSize。
在本例中,在 iPhone 15 Pro 上,即:
(207.0, 20.333333333333332)
那么,
.sizeThatFits()
上的宽度/高度值有何意义?
现在,我们几乎肯定会使用自动布局/约束,但我们不会这么称呼。但是,有有效的用例来设置标签的
.frame
。
假设我想要 30 点宽度?我这样做:
label.frame = .init(x: 20.0, y: 20.0, width: 30.0, height: ???)
我使用什么值作为高度?
// width doesn't really matter here... all I want is the Height
let sz = label.sizeThatFits(.init(width: 30.0, height: UILabel.noIntrinsicMetric))
label.frame = .init(x: 20.0, y: 20.0, width: 30.0, height: sz.height)
(就我个人而言,我会使用
ceil(sz.height)
)
请注意,如果
.numberOfLines = 0
我们会得到非常不同的回报:
label.numberOfLines = 0
let sz = label.sizeThatFits(.init(width: 30.0, height: UILabel.noIntrinsicMetric))
print(".numberOfLines = 0")
print(".sizeThatFits(CGSize(width: 30, height: UILabel.noIntrinsicMetric))")
print("sz:", sz)
我们得到这个输出:
.numberOfLines = 0
.sizeThatFits(CGSize(width: 30, height: UILabel.noIntrinsicMetric))
sz: (28.333333333333332, 182.66666666666666)