使用带交替baselineOffset的NSMutableAttributedString时UILabel文本截断问题
问题诱因
- 仅对脚注标记单独设置了
baselineOffset,未为整个富文本配置统一的段落样式,UILabel计算文本高度和绘制区域时,默认以占比最高的14号主字体参数为基准,10的偏移量超出了7号脚注字体的默认上行高度,导致脚注标记部分超出系统默认分配的行绘制区域,触发隐式裁剪。 - 多行富文本计算行间距时,未将首行基线偏移带来的额外高度计入全局行高参数,即便手动将UILabel高度调整到正确值,系统文本绘制逻辑仍会按原有行高限制每一行的绘制范围,超出部分直接丢弃不渲染。
- 你提到的
preferredMayLayoutWidth属于拼写错误,正确属性为preferredMaxLayoutWidth,属性配置错误也会导致高度计算异常。
可行解决方案
方案1:补充段落样式统一适配行高
为整个富文本添加统一的NSParagraphStyle,调整行高参数匹配基线偏移的额外高度,避免绘制溢出:
// 配置统一段落样式 let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.alignment = .left paragraphStyle.minimumLineHeight = 20 // 可根据实际字体大小和偏移量调整 paragraphStyle.lineBreakMode = .byWordWrapping // 脚注标记属性 let footnoteAttrs: [NSAttributedString.Key: Any] = [ .foregroundColor: UIColor.myColor, .font: UIFont.myFont(7), .baselineOffset: 8, // 可结合行高调整到合适的上移距离 .paragraphStyle: paragraphStyle ] // 正文属性 let textAttrs: [NSAttributedString.Key: Any] = [ .foregroundColor: UIColor.myColor, .font: UIFont.myFont(14), .paragraphStyle: paragraphStyle ] // 拼接富文本 let finalAttrStr = NSMutableAttributedString(string: mark, attributes: footnoteAttrs) finalAttrStr.append(NSAttributedString(string: text, attributes: textAttrs))
同时保证UILabel配置正确:
yourLabel.numberOfLines = 0 yourLabel.attributedText = finalAttrStr yourLabel.preferredMaxLayoutWidth = 你的label预期最大宽度 // 按实际布局调整
方案2:使用NSTextAttachment实现脚注标记
如果基线偏移的调整成本高,可以将脚注数字渲染为图片通过文本附件插入,完全规避基线对齐问题,系统计算高度时会自动适配附件尺寸:
// 先生成脚注标记的截图 let markLabel = UILabel() markLabel.font = UIFont.myFont(7) markLabel.textColor = UIColor.myColor markLabel.text = mark markLabel.sizeToFit() // UIView转UIImage的扩展可自行实现 let markImage = markLabel.asImage() // 创建文本附件 let attachment = NSTextAttachment() attachment.image = markImage // bounds的y值调整脚注的上下位置 attachment.bounds = CGRect(x: 0, y: 6, width: markLabel.bounds.width, height: markLabel.bounds.height) // 拼接富文本 let finalAttrStr = NSMutableAttributedString(attachment: attachment) finalAttrStr.append(NSAttributedString(string: text, attributes: textAttrs))
该方案不需要处理基线对齐逻辑,适配性更强,不会出现文本截断问题。
内容的提问来源于stack exchange,提问作者Victor Van Doom
相关产品推荐
相关产品推荐

