阅读/查看标签末尾的更多信息

时间:2017-09-28 18:28:34

标签: ios swift swift4

我正在尝试在标签的末尾创建一个read more按钮。我希望它默认显示3行。我编写的是快速而非客观的c。只有当用户点击标签的更多部分时,标签才会展开。除了在Instagram上,它应该看起来和工作完全像在Instagram上一样,它在tableview单元格中。我的标签和阅读更多按钮将在滚动视图中。我已经设法通过调整标签的行数属性来扩展和收缩部分。

var uid =req.header('UID');

我遇到了一个问题... ...更多"在标签的末尾,并在正确的地方切断文本。我看过其他人对类似问题的回答,但似乎没有什么工作正常。

我可以在文本的最后一行放置一个按钮,这样看不到标签可点击的更多部分也不是问题所在。我遇到的问题是在正确的位置截断文本并将更多文本放在正确的位置以便显示。

我还希望read more按钮仅在必要时出现。当只有1-3行文字时,我不希望它出现。这也是我遇到的问题。

我无法使用此https://github.com/apploft/ExpandableLabel,因为它不支持滚动视图,只是表格视图。

这里的快速解决方案没有成功:Add "...Read More" to the end of UILabel。它崩溃了应用程序。

最后,read more按钮应该与文本的最后一行和它的末尾一致。这也是一个额外的好处,它也适用于tableview单元格!

2 个答案:

答案 0 :(得分:1)

我在Github中找到了ReadMoreTextView,它基于UITextView。该库中的关键方法如下:

private func characterIndexBeforeTrim(range rangeThatFits: NSRange) -> Int {
    if let text = attributedReadMoreText {
        let readMoreBoundingRect = attributedReadMoreText(text: text, boundingRectThatFits: textContainer.size)
        let lastCharacterRect = layoutManager.boundingRectForCharacterRange(range: NSMakeRange(NSMaxRange(rangeThatFits)-1, 1), inTextContainer: textContainer)
        var point = lastCharacterRect.origin
        point.x = textContainer.size.width - ceil(readMoreBoundingRect.size.width)
        let glyphIndex = layoutManager.glyphIndex(for: point, in: textContainer, fractionOfDistanceThroughGlyph: nil)
        let characterIndex = layoutManager.characterIndexForGlyph(at: glyphIndex)
        return characterIndex - 1
    } else {
        return NSMaxRange(rangeThatFits) - readMoreText!.length
    }
}

显示“xxxx ... Read More”等文本,库

  1. 获取UITextView中可显示的字符数:使用NSLayoutManager.characterRange(forGlyphRange:, actualGlyphRange:)
  2. 获取最后一个可见字符的位置和“...阅读更多”的宽度:使用NSLayoutManager.boundingRect(forGlyphRange glyphRange: NSRange, in container: NSTextContainer)
  3. 修剪前获取字符索引:使用NSLayoutManager.characterIndexForGlyph(at glyphIndex: Int)
  4. 用“...阅读更多”替换应修剪的文字:UITextStorage.replaceCharacters(in range: NSRange, with attrString: NSAttributedString)

答案 1 :(得分:0)

请检查:

func addSeeMore(str: String, maxLength: Int) -> NSAttributedString {
    var attributedString = NSAttributedString()
    let index: String.Index = str.characters.index(str.startIndex, offsetBy: maxLength)
    let editedText = String(str.prefix(upTo: index)) + "... See More"
    attributedString = NSAttributedString(string: editedText)

    return attributedString
}

您可以使用:

let str = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."
descriptionLabel.attributedText = addSeeMore(str: str, maxLength: 20) 
// Output : Lorem Ipsum is simpl... See More