如何让UILabel遇超长单词时自动扩宽避免字符换行?
解决UILabel超长单词自动扩展宽度的问题
核心思路
要实现「默认宽度180,仅当超长单词无法容纳时扩展至能完整容纳最长单词的最小宽度」,关键是确保Label宽度至少能覆盖最长单词的显示宽度,同时保留3行限制和单词换行规则。具体逻辑:
- 先计算文本中最长单词的实际显示宽度
- 将Label宽度设置为「180」和「最长单词宽度」中的较大值
- 保留原有行数和换行模式,让内容在确定宽度后按单词换行,最多显示3行
代码实现
1. 计算最长单词宽度的工具方法
func calculateLongestWordWidth(for text: String, with font: UIFont) -> CGFloat { // 拆分文本为单词,过滤空内容 let words = text.components(separatedBy: CharacterSet.whitespacesAndNewlines).filter { !$0.isEmpty } guard let longestWord = words.max(by: { $0.count < $1.count }) else { return 0 } // 计算该单词的实际显示宽度 let attributes: [NSAttributedString.Key: Any] = [.font: font] return longestWord.size(withAttributes: attributes).width }
2. 配置Label的完整代码
let myString = "thisisaveryveryveryveryverylongstring" let myLabel = UILabel() myLabel.text = myString myLabel.numberOfLines = 3 myLabel.lineBreakMode = .byWordWrapping // 明确字体(避免默认字体变化导致宽度计算偏差) myLabel.font = UIFont.systemFont(ofSize: 17) // 计算所需最小宽度:取180和最长单词宽度的较大值 let longestWordWidth = calculateLongestWordWidth(for: myString, with: myLabel.font) let requiredMinWidth = max(180, longestWordWidth) // 设置最终宽度约束 myLabel.widthAnchor.constraint(equalToConstant: requiredMinWidth).isActive = true
关键说明
- 必须明确Label的字体:字体大小、样式会直接影响单词宽度的计算,确保计算值与实际显示完全匹配
- 之前方法无效的原因:
- 固定宽度约束会强制Label在180宽度内显示,超长单词只能被拆分为字符换行
preferredWidth仅作为Auto Layout的参考值,无法覆盖固定宽度约束的优先级;调低宽度约束优先级后,若无其他约束,Label会根据拆分后的字符内容计算 intrinsicContentSize,仍无法避免单词拆分
内容的提问来源于stack exchange,提问作者Olivia Brown
相关产品推荐
相关产品推荐

