如何移除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
相关产品推荐
相关产品推荐

