对于单行标签,UILabel sizeThatFits 不应该返回小于或等于给定尺寸的尺寸,而不是更大的尺寸吗?

问题描述 投票:0回答:1

我有一个具有以下配置的单行 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()
相同的大小。在任何建议的答案中都没有可以使用的其他解决方法。

ios swift uikit uilabel
1个回答
0
投票

来自苹果的文档

讨论

此方法的默认实现返回视图的现有大小。子类可以重写此方法,以根据任何子视图所需的布局返回自定义值。例如, 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)
© www.soinside.com 2019 - 2024. All rights reserved.