Теперь я знаю, что существуют десятки вопросов, которые задают ту же самую вещь, однако большинство из них не относятся к многострочным меткам или имеют ответы, которые не работают или устарели.Я посмотрел.
Я пытаюсь определить минимальный размер шрифта, необходимый для отображения message
внутри UILabel из 3 строк, занимающего только maximumContentWidth
ширину и со шрифтом UIFont.systemFont(.regular)
.Теперь я понимаю, что в UILabel есть свойства, которые позволяют ему автоматически уменьшаться, чтобы соответствовать размеру, который мне не подходит.Мне нужно определить конкретное число для минимального размера шрифта, чтобы применить его ко многим другим UILabels, некоторые из них отображают значительно меньше текста.
У меня максимальный размер шрифта составляет 20, а минимальный размер шрифта составляет13.
В настоящее время я частично использую решение, найденное здесь , однако оно работает только теоретически.Я не совсем уверен, почему, но когда я сделал какой-то тестовый текст, который был хорош для таких строк, как "fa fa fa ...", где fa повторяется до тех пор, пока я не узнаю визуально, что один fa не может вписаться в максимальный шрифт.Однако для таких строк, как "Ww wwwwwwwww wwww wwww ww wwww www w www www wwwwwww www wwwwwwww wwwwwww. Www wwwwwwww wwwwwww wwww www wwwwww www wwwwwwww www wwwwww wwww www 10000 wwww. Wwww ww ww ww, ww www www wwwwwwwwww www www wwwww wwwwwwwwwww www wwwwwwwwwwww. "система полностью выходит из строя, не делая текст таким маленьким, каким он должен быть.
Итак, вот детектор
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
}
Почему этот метод не работает и чем его можно заменить?