实现的关键,在于获取到label内容的最后一个字符的位置,然后在对应位置添加一个自定义视图,并对视图做一个透明度变化的动效即可。也可以在对应位置添加图片满足其他需求。
获取位置的关键:
- NSLayoutManager
- NSTextContainer
- NSTextStorage
extension UILabel {
func lastCharacterRect()->CGRect? {
guard let text = text else { return nil }
let textCount = text.count
let layoutManager = NSLayoutManager()
let textContainer = NSTextContainer(size: bounds.size)
textContainer.lineFragmentPadding = 0
textContainer.maximumNumberOfLines = numberOfLines
let style = NSMutableParagraphStyle()
style.lineSpacing = font.lineHeight - font.pointSize
/*
如果使用富文本并且设置了行间距
style.lineSpacing = 行间距 + (font.lineHeight-font.pointSize)
*/
style.lineBreakMode = lineBreakMode
style.alignment = textAlignment
let textStorage = NSTextStorage(string: text)
if let font = font {
textStorage.addAttribute(NSAttributedString.Key.font, value: font, range: NSMakeRange(0, textCount))
}
textStorage.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: NSMakeRange(0, textCount))
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
let characterRange = NSMakeRange(textCount-1, 1)
let glyphRange = layoutManager.glyphRange(forCharacterRange: characterRange, actualCharacterRange: nil)
let realRect = layoutManager.boundingRect(forGlyphRange: glyphRange, in: textContainer)
return realRect
}
}