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

Ios 阅读/查看标签末尾的更多信息,ios,swift,swift4,Ios,Swift,Swift4,我正在尝试在标签的末尾创建一个“阅读更多”按钮。我希望它在默认情况下显示3行。我用的是swift而不是目标c。只有当用户单击标签的“阅读更多”部分时,标签才会展开。它的外观和工作方式应该与instagram完全相同,但instagram除外,它位于tableview单元格中。我的标签和阅读更多按钮将在滚动视图中。通过调整标签的“线数”属性,我成功地使展开和收缩部分工作 if descriptionLabel.numberOfLines == 0{ descriptionLabel.num

我正在尝试在标签的末尾创建一个“阅读更多”按钮。我希望它在默认情况下显示3行。我用的是swift而不是目标c。只有当用户单击标签的“阅读更多”部分时,标签才会展开。它的外观和工作方式应该与instagram完全相同,但instagram除外,它位于tableview单元格中。我的标签和阅读更多按钮将在滚动视图中。通过调整标签的“线数”属性,我成功地使展开和收缩部分工作

if descriptionLabel.numberOfLines == 0{
    descriptionLabel.numberOfLines = 3
}else {
    descriptionLabel.numberOfLines = 0
}
descriptionLabel.lineBreakMode = NSLineBreakMode.byWordWrapping
我在标签的末尾加上“…更多”并在正确的位置切掉文本时遇到了问题。我看过其他人对类似问题的回答,但似乎没有什么能正常工作

我可以在最后一行文本上放置一个按钮,因此使标签的“查看更多部分”可单击也不是问题。我遇到的问题是在正确的位置截断文本,并将“查看更多”文本放置在正确的位置,以便显示

我还希望“阅读更多”按钮仅在必要时出现。我不想在只有1-3行文本时出现它。这也是我有问题的地方

我不能使用它,因为它不支持滚动视图,只支持表格视图

此处的swift解决方案无效:。它使应用程序崩溃

最后,“阅读更多”按钮应与文本的最后一行保持一致,并位于最后一行。这将是一个额外的好处,它工作在一个tableview单元格以及

请检查:

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
我在Github中找到了它,它基于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…阅读更多”之类的文本,库

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

  • 您是否检查了链接到的“ExpandableLabel”GitHub项目,看看是否可以在表视图之外使用它?我快速浏览了一下,它似乎完全可以满足您的需求——作者只是简单地展示了在表视图单元格中使用它的演示(这将是一个非常常见的用例)。我建议你试试。我确实试过了,在iOS 10中它工作得很好,但在iOS 11中它不工作“…在iOS 11中它不工作…”你能说得更含糊一点吗?什么不起作用?错误?警告?什么都没出现?标签显示但无法点击?标签显示但不会折叠?在iOS 10上的滚动视图中工作正常(我这里没有iOS 11可用)。你有没有在10年内让它工作,但在11年内它“不起作用”?是的,它在iOS 11中不起作用。“查看更多”按钮不会显示。控制台中没有错误或崩溃。它只是不显示。这会计算字符数,而不是行数,因此它不会在不同大小的设备上工作。