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

如何移除NSTextAttachment中显示的默认图片图标?

问题原因说明

你遇到的实机额外显示默认图标的问题,是iOS系统UIKit的默认逻辑:当NSTextAttachment没有有效的可展示image时,实机环境会自动绘制系统占位图标,而部分模拟器版本出于性能考虑未启用该fallback逻辑,所以会出现两边表现不一致的情况。


解决方案1:拦截系统默认附件绘制(最推荐)

直接在自定义NSLayoutManager子类中重写drawAttachment方法,错误状态下跳过系统的默认绘制逻辑,从根源避免占位图生成:

override func drawAttachment(_ attachment: NSTextAttachment, forGlyphRange glyphRange: NSRange, in rect: CGRect) {
    // 判断如果是自定义附件且存在错误
    if let myAttachment = attachment as? MyImageAttachment, myAttachment.imageError != nil {
        // 错误状态直接返回,不调用系统默认绘制,不会生成占位图
        return
    }
    // 其余正常场景走系统默认逻辑
    super.drawAttachment(attachment, forGlyphRange: glyphRange, in: rect)
}

解决方案2:自定义Attachment的image返回逻辑

在你的MyImageAttachment子类中重写image属性的getter,错误状态下返回透明空图,让系统认为附件有有效内容,不会触发占位图绘制:

override var image: UIImage? {
    get {
        // 存在错误时返回透明空图,阻止系统占位逻辑
        if imageError != nil {
            return UIImage()
        }
        return super.image
    }
    set {
        super.image = newValue
    }
}

解决方案3:绘制时覆盖残留内容

如果前两种方案有兼容问题,可以在你现有绘制错误信息的逻辑前,先给目标区域填充和文本容器一致的背景色,彻底覆盖系统可能绘制的占位图:
在你创建完bezier path之后、绘制错误文字之前,添加以下代码:

// 填充和文本视图背景一致的颜色,覆盖系统绘制内容
UIColor.systemBackground.setFill()
UIRectFill(imageRect)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:12:01