是否计算UITextView中的文本是否小于4 maximumNumberOfLines限制?

时间:2019-06-26 15:28:38

标签: ios swift uitextview

我有一个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 :(得分:0)

基于此处的讨论:Counting the number of lines in a UITextView, lines wrapped by frame size

这似乎可以可靠地用于我的测试:

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
}