Ответ 1
Начните с полной строки и известной двухстрочной высоты метки и ее известной ширины и продолжайте вырезать слова с конца строки до тех пор, пока на этой ширине высота строки будет меньше высоты метки. Затем отделите еще одно слово от конца для хорошей меры, добавьте многоточие и поместите полученную строку в метку.
Таким образом, я получил следующее:
Обратите внимание, что слово "время" никогда не начинается; мы останавливаемся на точном конце слова с вставленным эллипсисом. Вот как я это сделал:
lab.numberOfLines = 2
let s = "Little poltergeists make up the principle form of material " +
"manifestation. Now is the time for all good men to come to the " +
"aid of the country."
let atts = [NSFontAttributeName: UIFont(name: "Georgia", size: 18)!]
let arr = s.components(separatedBy: " ")
for max in (1..<arr.count).reversed() {
let s = arr[0..<max].joined(separator: " ")
let attrib = NSMutableAttributedString(string: s, attributes: atts)
let height = attrib.boundingRect(with: CGSize(width:lab.bounds.width,
height:10000),
options: [.usesLineFragmentOrigin],
context: nil).height
if height < lab.bounds.height {
let s = arr[0..<max-1].joined(separator: " ") + "…"
let attrib = NSMutableAttributedString(string: s, attributes: atts)
lab.attributedText = attrib
break
}
}
Конечно, можно быть намного более изощренным в том, что составляет "слово" и в условиях измерения, но приведенное выше демонстрирует общую общую технику для такого рода вещей и должно быть достаточно, чтобы вы начали.