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

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

if descriptionLabel.numberOfLines == 0{
    descriptionLabel.numberOfLines = 3
}else {
    descriptionLabel.numberOfLines = 0
}
descriptionLabel.lineBreakMode = NSLineBreakMode.byWordWrapping

我在标签的末尾添加“… more”并在正确的位置剪切文本时遇到问题.我看过其他人对类似问题的回答,但似乎没有什么工作正常.

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

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

我不能使用这个https://github.com/apploft/ExpandableLabel,因为它不支持滚动视图只是tableviews.

这里的快速解决方案无效:Add “…Read More” to the end of UILabel.它崩溃了应用程序.

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

最佳答案 我在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”这样的文本库

>获取UITextView中可显示的字符数:使用NSLayoutManager.characterRange(forGlyphRange:,actualGlyphRange 🙂
>获取最后一个可见字符的位置和“…阅读更多”的宽度:使用NSLayoutManager.boundingRect(forGlyphRange glyphRange:NSRange,in container:NSTextContainer)
>在修剪前获取字符索引:使用NSLayoutManager.characterIndexForGlyph(在glyphIndex:Int处)
>用“… Read More”替换应修剪的文本:UITextStorage.replaceCharacters(范围:NSRange,带attrString:NSAttributedString)

点赞