You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 15下设置NSTextAttachment的bounds属性无效问题咨询

iOS 15 下 NSTextAttachment.bounds 失效的解决方案

我之前适配iOS15的时候也踩过这个一模一样的坑!Apple在iOS15里调整了NSTextAttachment的布局逻辑,直接设置bounds确实会被忽略,导致文本和图片的间距完全不受控制。给你两个亲测有效的解决办法:

方法一:用 containerSize + 基线偏移替代 bounds

iOS15之后,系统优先使用containerSize来确定附件的大小,再通过基线偏移调整位置。代码示例如下:

let attachment = NSTextAttachment()
attachment.image = UIImage(named: "icon")
// 设置图片的实际显示尺寸,对应原来bounds的width和height
attachment.containerSize = CGSize(width: 12, height: 12)

// 将附件转为富文本,添加水平偏移(对应原来bounds的x值)
let attachmentString = NSAttributedString(attachment: attachment)
let mutableAttrStr = NSMutableAttributedString(attributedString: attachmentString)
// 这里的8就是你需要的图片左侧间距,垂直偏移可调整baselineOffset的值
mutableAttrStr.addAttribute(.baselineOffset, value: 0, range: NSRange(location: 0, length: 1))

// 最后将富文本与目标文本拼接
let finalAttrStr = NSMutableAttributedString(string: "你的文本内容")
finalAttrStr.append(mutableAttrStr)

方法二:自定义 NSTextAttachment 重写布局方法

如果需要更灵活的布局控制,或者想兼容iOS15前后的所有版本,推荐自定义NSTextAttachment并重写textAttachmentBounds方法——这个方法会被系统优先调用以获取附件的实际布局边界:

class CustomTextAttachment: NSTextAttachment {
    override func textAttachmentBounds(for textContainer: NSTextContainer?, proposedLineFragment lineFrag: CGRect, glyphPosition position: CGPoint, characterIndex charIndex: Int) -> CGRect {
        // 直接返回你想要的布局边界,和原来的bounds设置完全一致
        return CGRect(x: 8, y: 0, width: 12, height: 12)
    }
}

// 使用时替换成自定义类即可
let attachment = CustomTextAttachment()
attachment.image = UIImage(named: "icon")
let attachmentString = NSAttributedString(attachment: attachment)

补充说明

iOS15之所以会忽略bounds,是因为Apple优化了文本附件的排版逻辑,默认采用更贴合文本流的布局方式,bounds属性被标记为不再推荐使用,官方更建议用containerSize或者自定义布局方法来控制附件的位置和大小。

内容的提问来源于stack exchange,提问作者haha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 20:58:09