iOS开发:如何获取UILabel的可见文本字符串及多行截断后的可见内容?
UILabel可见文本获取指南
嘿,我来帮你搞定这两个关于UILabel文本的问题!
一、基础情况:未截断的可见文本转字符串
如果你的UILabel文本没有被截断(所有内容完整显示),那直接拿text属性就完事了:
let visibleText = myLabel.text
这个属性返回的就是Label上显示的完整字符串,直接用就行。
二、进阶情况:多行截断后获取可见文本
当文本太长被截断成指定行数(比如你说的3行),text属性还存着完整原始文本,这时候得靠文本布局计算来拿到真正显示在屏幕上的内容。
我给你写了个UILabel的扩展方法,能精准算出可见文本:
extension UILabel { func getVisibleText() -> String? { guard let fullText = self.text, let labelFont = self.font else { return nil } // 模拟Label的文本存储与字体属性 let textStorage = NSTextStorage(string: fullText, attributes: [.font: labelFont]) // 负责文本布局计算的管理器 let layoutManager = NSLayoutManager() textStorage.addLayoutManager(layoutManager) // 匹配Label的尺寸、行数、换行规则的文本容器 let textContainer = NSTextContainer(size: self.bounds.size) textContainer.lineBreakMode = self.lineBreakMode textContainer.maximumNumberOfLines = self.numberOfLines textContainer.lineFragmentPadding = 0 // 去掉系统默认内边距,保证计算精准 layoutManager.addTextContainer(textContainer) // 获取可见字形范围,再转换为字符范围 let visibleGlyphRange = layoutManager.glyphRange(for: textContainer) let visibleCharRange = layoutManager.characterRange(forGlyphRange: visibleGlyphRange, actualGlyphRange: nil) // 处理截断后的省略号(按需调整,想保留就删掉这段逻辑) let isTextTruncated = layoutManager.extraLineFragmentTextContainer != nil var visibleText = (fullText as NSString).substring(with: visibleCharRange) if isTextTruncated && visibleText.hasSuffix("…") { visibleText = String(visibleText.dropLast()) } return visibleText } }
使用说明
一定要在Label布局完成后调用(比如viewDidLayoutSubviews里,别在viewDidLoad调用,这时候Label的frame还没确定):
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if let visibleText = myMultilineLabel.getVisibleText() { // 拼接"Read More" let displayText = "\(visibleText) Read More" myMultilineLabel.text = displayText // 后续记得处理点击"Read More"展开全文的逻辑哦 } }
注意点
- 确保Label的
numberOfLines、lineBreakMode、font等属性都已正确设置,否则计算结果会偏差。 - 必须在Label的frame确定后调用方法,尺寸不对会导致计算错误。
内容的提问来源于stack exchange,提问作者Programming Learner
相关产品推荐
相关产品推荐

