Вычислять, если текст в UITextView меньше, чем предел 4 MaximumNumberOfLines? - PullRequest
0 голосов
/ 26 июня 2019

У меня установлен UITextView для предварительного просмотра 4 строк текста, когда пользователь нажимает «читать дальше», ограничение устанавливается равным 0 максимальным строкам и отображается во всю длину.

func showMore() {
    self.readMoreLabel.snp.updateConstraints { (make) -> Void in
        make.height.equalTo(0)
    }

    _descriptionHeight?.deactivate()
    descriptionTextView.textContainer.maximumNumberOfLines = 0
    descriptionTextView.invalidateIntrinsicContentSize()
}

Это прекрасно работает, но в некоторых случаях количество строк текста меньше или равно 4, поэтому нет необходимости в кнопке «читать дальше».

Я не вижу способа рассчитать, если текст меньше 4-строчного предела, чтобы скрыть кнопку read more. Так как размер содержимого ограничен линией строки, я не могу проверить, соответствует ли высота кадра или аналогичные стандартные методы.

Вот что я попробовал без удачи:

func setDescription(_ description: NSAttributedString) {
    descriptionTextView.attributedText = description

    setNeedsLayout()
    layoutIfNeeded()

    if descriptionTextView.contentSize.height < descriptionTextView.bounds.height {
        self.readMoreLabel.snp.updateConstraints { (make) -> Void in
            make.height.equalTo(0)
        }
    }
}

Может кто-нибудь посоветовать, как мне выполнить проверку, которая сможет рассчитать, если содержание uitextview будет как-то меньше 4 строк?

1 Ответ

0 голосов
/ 26 июня 2019

Основываясь на обсуждении здесь: Подсчет количества строк в UITextView, строк, обернутых размером кадра

Кажется, это надежно работает для моего тестирования:

func getNumberOfLines(in textView: UITextView) -> Int {

    let numberOfGlyphs = textView.layoutManager.numberOfGlyphs
    var index = 0, numberOfLines = 0
    var lineRange = NSRange(location: NSNotFound, length: 0)

    while index < numberOfGlyphs {
        textView.layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
        index = NSMaxRange(lineRange)
        numberOfLines += 1
    }

    return numberOfLines
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...