NSStringDrawingOptions.usesLineFragmentOrigin选项未按预期工作问询
解决NSAttributedString draw(with:)裁剪不符预期的问题
我之前也踩过这个坑!你遇到的问题其实是对NSStringDrawingOptions.usesLineFragmentOrigin的作用理解有点偏差,再加上缺少了关键的段落样式配置导致的。
先理清核心问题
usesLineFragmentOrigin的作用只是指定文本布局的原点是rect的左上角(默认是基线对齐),它本身并不负责控制文本超出rect时的裁剪逻辑。你看到的“仅裁剪部分内容”,大概率是因为你的NSAttributedString没有配置合适的段落样式,导致文本换行和裁剪行为不符合预期。
正确的解决步骤
1. 配置段落样式,明确裁剪/换行规则
首先给你的NSAttributedString添加段落样式,指定超出rect时的处理方式:
let paragraphStyle = NSMutableParagraphStyle() // 选择你需要的换行/裁剪模式: // .byClipping: 直接裁剪超出rect的内容 // .byTruncatingTail: 最后一行超出部分显示省略号 // .byWordWrapping: 自动换行,超出rect的部分被裁剪 paragraphStyle.lineBreakMode = .byClipping // 组装带样式的富文本 let attributedString = NSAttributedString( string: "你的长文本内容", attributes: [ .paragraphStyle: paragraphStyle, .font: UIFont.systemFont(ofSize: 16) ] )
2. 正确组合绘制选项
调用draw(with:options:context:)时,根据需求组合选项:
- 如果只是需要从左上角布局并裁剪超出内容:
attributedString.draw( with: yourTargetRect, options: [.usesLineFragmentOrigin], context: nil )
- 如果希望最后一行超出时显示省略号,加上
truncatesLastVisibleLine:
attributedString.draw( with: yourTargetRect, options: [.usesLineFragmentOrigin, .truncatesLastVisibleLine], context: nil )
为什么之前不符合文档描述?
苹果文档里对usesLineFragmentOrigin的描述只聚焦在布局原点上,并没有提及裁剪逻辑——裁剪行为是由段落样式的lineBreakMode控制的。之前你没有配置段落样式,使用了默认的byWordWrapping,所以文本会自动换行,但超出rect高度的部分被裁剪,看起来就像是“只裁剪了部分内容”,这其实是默认行为,不是方法的问题。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

