【发布时间】:2018-09-19 08:31:22
【问题描述】:
现在我知道有几十个问题会问同样的问题,但其中大多数与多行标签无关,或者答案无效或已过时。我看过了。
我试图找出在仅占用maximumContentWidth 宽度和字体UIFont.systemFont(.regular) 的3 行UILabel 内显示message 所需的最小字体大小。现在我意识到 UILabel 中有一些属性可以让它自动缩小以适应,但这对我不起作用。我需要确定最小字体大小的具体数字,以便将其应用于多个其他 UILabel,其中一些 UILabel 显示的文本显着减少。
我的最大字体大小为 20,最小字体大小为 13。
我目前正在部分使用here 找到的解决方案,但它仅在理论上有效。我不完全确定为什么,但是当我在“fa fa fa ...”之类的字符串上做了一些很棒的测试文本时,重复 fa 直到我从视觉上知道一个 fa 不能适应最大字体。但是对于像“Ww wwwwwww wwww wwww ww wwww www www www wwwwwww www wwwwwwwwww wwwwwww www www wwwwwwwww www wwwwwwwwww www www www www 10,000 wwww www www www www www www www www www www www www万维网万维网万维网万维网。”系统完全崩溃,没有使文本尽可能小。
所以这里是检测器
extension UILabel {
var isTruncated: Bool {
guard let labelText = text else {
return false
}
let labelTextSize = (labelText as NSString).boundingRect(
with: CGSize(width: frame.size.width, height: .greatestFiniteMagnitude),
options: .usesLineFragmentOrigin,
attributes: [.font: font],
context: nil).size
return labelTextSize.height > bounds.size.height
}
}
这是我的使用方法:
var testLabel = UILabel()
var font = 20
testLabel.numberOfLines = 3
testLabel.frame.size.width = maximumContentWidth
while font > 13 {
testLabel.text = message
testLabel.font = UIFont.systemFont(ofSize: font, weight: .regular)
testLabel.sizeToFit()
if !testLabel.isTruncated {
break
}
font -= 0.1
}
为什么这种方法不起作用,什么是合适的替代品?
【问题讨论】:
-
嗯,你的例子是什么时候坏了,我怀疑 13 号的尺寸不够小。