Неверное значение межстрочного интервала для приписанного текста внутри UILabel - PullRequest
0 голосов
/ 14 марта 2019

У меня есть пользовательский экземпляр UITableViewCell с объектом UILabel. Я реализовал метод для помещения любого динамически связанного текста внутри метки. Мой код работает, но иногда я встречаю неожиданный межстрочный интервал в разных ячейках. Например:

enter image description here

На скриншоте вы можете заметить ненормальное пространство между 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, но это не помогает (и это не должно быть решением).

...