У меня есть пользовательский экземпляр UITableViewCell
с объектом UILabel
. Я реализовал метод для помещения любого динамически связанного текста внутри метки. Мой код работает, но иногда я встречаю неожиданный межстрочный интервал в разных ячейках. Например:
На скриншоте вы можете заметить ненормальное пространство между 4-й и 5-й строками. Увеличенное (больше, чем мне нужно) пространство строки может появиться в любом месте, между любыми строками. Но это не всегда. Я не могу понять, на чем основана эта ошибка.
Моя общая логика:
final func setupTitleLabel(_ label: inout UILabel, withoutSubTitle noSubTitle: Bool) {
defer {
label.setupLineHeight()
}
if noSubTitle {
label.attributedText = String.attributedNewsTitleByTitle(self.title)
} else {
label.attributedText = String.attributedNewsTitleByTitle(self.title, withSubTitle: self.subTitle)
}
}
Если загруженные данные с сервера имеют субтитры, я использую метод статической строки attributedNewsTitleByTitle:withSubTitle
, который возвращает NSAttributedString
instance:
static func attributedNewsTitleByTitle(_ title: String, withSubTitle subTitle: String) -> NSAttributedString {
let attributedString = NSMutableAttributedString(string: title + " \(subTitle)")
guard let titleFont = UIFont(name: String.heavyFont, size: 16) else {
return attributedString
}
guard let subTitleFont = UIFont(name: String.mediumFont, size: 15) else {
return attributedString
}
if subTitle.isEmpty {
attributedString.addAttribute(
NSAttributedString.Key.font,
value: subTitleFont,
range: NSMakeRange(0, title.count)
)
return attributedString
} else {
attributedString.addAttribute(
NSAttributedString.Key.font,
value: titleFont,
range: NSMakeRange(0, title.count)
)
attributedString.addAttribute(
NSAttributedString.Key.font,
value: subTitleFont,
range: NSMakeRange(title.count + 1, subTitle.count)
)
return attributedString
}
}
И только после форматирования текста я подготавливаю пробел, используя собственное расширение UILabel
:
extension UILabel {
func setupLineHeight() {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 1.0
paragraphStyle.lineHeightMultiple = 1.3
paragraphStyle.alignment = self.textAlignment
let attributedString = NSMutableAttributedString()
if let attributedText = self.attributedText {
attributedString.append(attributedText)
} else {
attributedString.append(NSMutableAttributedString(string: self.text ?? ""))
attributedString.addAttribute(
NSAttributedString.Key.font,
value: self.font,
range: NSMakeRange(0, attributedString.length)
)
}
attributedString.addAttribute(
NSAttributedString.Key.paragraphStyle,
value: paragraphStyle,
range: NSMakeRange(0, attributedString.length)
)
self.attributedText = attributedString
self.layoutIfNeeded()
}
}
Есть идеи по поводу этого глюка?
P.S. Да, я использую автоматический размер для расчета динамической высоты ячейки. И да, я пытался увеличить вертикальные приоритеты как для Content Hugging
, так и для Content Compression Resistance
, но это не помогает (и это не должно быть решением).