UILabel设置NSMutableAttributedString换行后第二行内容不显示问题求助
解决UILabel中NSMutableAttributedString换行后第二段消失的问题
嘿,我帮你定位到了问题的两个核心原因,结合Apple文档的规则,给你整理了可行的解决方案:
问题根源
- UILabel默认只显示1行:你没设置
numberOfLines属性,默认值是1,哪怕加了换行符,标签也只会渲染第一行,后面的内容直接被截断了。 - 追加的文本未继承段落样式:你只给第一段文本配置了
paragraphStyle,但第二段文本没有应用这个样式,这会导致多行布局时出现异常。
修正后的完整代码
首先,调整UILabel的初始化,允许显示多行:
var totalVisitsLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.numberOfLines = 0 // 关键:设置为0表示自动适配行数 return label }()
然后,统一配置段落样式并应用到两段文本上:
// 创建通用段落样式 let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.alignment = .center paragraphStyle.lineBreakMode = .byWordWrapping paragraphStyle.lineSpacing = 4 // 可选:添加行间距让排版更美观 // 第一段数字文本 let countString = NSMutableAttributedString( string: "\(visitLogs.count)", attributes: [ .font: UIFont.systemFont(ofSize: 25), .foregroundColor: UIColor.black, // 可根据需求修改颜色 .paragraphStyle: paragraphStyle ] ) // 第二段描述文本(包含换行符) let descString = NSMutableAttributedString( string: "\nTotal visits", attributes: [ .font: UIFont.systemFont(ofSize: 14), .foregroundColor: UIColor.gray, // 可选:用不同颜色区分 .paragraphStyle: paragraphStyle ] ) // 拼接两段文本 countString.append(descString) // 赋值给标签 totalVisitsLabel.attributedText = countString
额外小贴士
- 确保你的标签有明确的宽度约束(比如固定宽度或者和父视图边缘绑定),这样文本才能正确换行。
- 不用额外调用
sizeToFit(),只要numberOfLines设为0,Auto Layout会自动计算标签的高度。 - 可以通过打印
totalVisitsLabel.attributedText的属性,验证每一段的样式是否正确应用。
这样修改后,两段不同字体的文本就能正常上下排列显示啦!
内容的提问来源于stack exchange,提问作者Holmes
相关产品推荐
相关产品推荐

