【问题标题】:Calculating if text in UITextView is less than the 4 maximumNumberOfLines limit?计算 UITextView 中的文本是否小于 4 maximumNumberOfLines 限制?
【发布时间】:2019-06-26 15:28:38
【问题描述】:

我有一个 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 行的检查吗?

【问题讨论】:

标签: ios swift uitextview


【解决方案1】:

基于此处的讨论: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
}

【讨论】:

  • 嗯这对我不起作用,可能是由于设置内容时的时间问题
  • 你什么时候尝试使用它?
  • 它在视图实例化后运行的配置函数中调用,
  • @jwarris91 - 在 after 自动布局确定 textView 的宽度之前,您将无法获得行数。听起来你正试图在那之前得到它。 textView 是否在 tableView 单元格中?
  • 它是 tableview 单元格的视图,我将其转换为在应用程序中需要成为 UIView 的其他地方使用
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多