UILabel的numberOfLines属性失效,该如何修复?
修复UILabel的numberOfLines属性不生效问题
嘿,我来帮你搞定这个问题!你的代码里有几个细节导致numberOfLines没按预期工作,咱们一步步梳理修复:
问题根源
sizeToFit()的行为:当你给UILabel设置attributedText后调用sizeToFit(),它会忽略numberOfLines的限制,直接计算完整文本所需的高度,不会自动截断到指定行数。- 富文本样式优先级:你设置了label的
lineBreakMode,但没有同步到富文本的段落样式里,富文本的段落样式优先级更高,导致换行规则没生效。 - frame设置方式:直接给
frame.size.width赋值不够稳妥,应该先明确label的宽度约束,再计算对应高度。
修复方案
下面是调整后的完整代码,我标注了关键修改点:
let texts = UILabel() // 1. 先明确label的固定宽度,沿用你设定的100 let labelWidth: CGFloat = 100 // 初始化frame时先固定宽度,高度暂时设为0 texts.frame = CGRect(x: 0, y: 0, width: labelWidth, height: 0) // 2. 先设置label的基础属性 texts.numberOfLines = 2 texts.lineBreakMode = .byWordWrapping texts.font = UIFont.systemFont(ofSize: 15, weight: .light) texts.backgroundColor = .clear // 3. 创建富文本样式时,同步lineBreakMode到段落样式 let detailSpaceStyle = NSMutableParagraphStyle() detailSpaceStyle.lineSpacing = 6.0 detailSpaceStyle.lineBreakMode = texts.lineBreakMode // 关键:同步换行规则 // 4. 富文本属性里明确包含字体,避免样式不一致 let textContent = "fehjafiuehfoaijeoijaoifjajfeiojfoiafeafelfhlkfesjahflkejshflesjfheakjfehlfkjehalkfh" let detailSpaceAttr: [NSAttributedString.Key: Any] = [ .paragraphStyle: detailSpaceStyle, .font: texts.font! ] // 5. 直接设置attributedText,无需先设置普通text texts.attributedText = NSAttributedString(string: textContent, attributes: detailSpaceAttr) // 6. 计算符合行数限制的尺寸,替代sizeToFit() let maxAllowedSize = CGSize(width: labelWidth, height: CGFloat.greatestFiniteMagnitude) let actualSize = texts.sizeThatFits(maxAllowedSize) // 把计算后的高度赋值给label texts.frame.size.height = actualSize.height
额外说明
- 如果你的项目用AutoLayout,不需要手动设置frame:给label添加固定宽度约束,然后设置
numberOfLines和attributedText,系统会自动计算符合行数限制的高度。 sizeThatFits(maxAllowedSize)会在numberOfLines的限制下,返回文本截断后的实际尺寸,这比sizeToFit()更可靠,尤其是使用富文本时。
内容的提问来源于stack exchange,提问作者WaFuNuke
相关产品推荐
相关产品推荐

