如何检测UIImageView是否仍保留默认图片?
解决UIImageView默认图片检测问题
嘿,我懂你现在的困扰——要判断第二个UIImageView是不是还显示默认图,这样发邮件的时候就能决定要不要把它加进去对吧?这里有几个靠谱的方法,你可以根据自己的情况选:
方法1:直接对比图片实例
首先,你需要把默认图片提前存成一个全局或者类的实例变量,别每次用的时候才去加载:
// 在你的ViewController里定义 let defaultImageViewImage = UIImage(named: "你的默认图片文件名")
然后在初始化UIImageView的时候,就用这个变量设置默认图:
firstImageView.image = defaultImageViewImage secondImageView.image = defaultImageViewImage
这样在检测的时候,直接用isEqual(_:)方法对比(比==更可靠,因为UIImage的相等判断有时候会受缓存影响):
// 调用邮件撰写视图时的检测逻辑 if let currentImage = secondImageView.image, currentImage.isEqual(defaultImageViewImage) { // 还是默认图,不加入邮件 } else { // 已经是用户拍摄的图片,加入邮件 }
方法2:给UIImageView加自定义标记
如果觉得对比图片实例不够稳妥,你可以给UIImageView加一个自定义属性,用来标记是否已经替换成用户的图片:
// 扩展UIImageView,添加关联属性 extension UIImageView { private static let hasCustomImageKey = UnsafeRawPointer(bitPattern: "hasCustomImage".hashValue)! var hasCustomImage: Bool { get { return objc_getAssociatedObject(self, UIImageView.hasCustomImageKey) as? Bool ?? false } set { objc_setAssociatedObject(self, UIImageView.hasCustomImageKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } }
然后在用户拍摄完图片、设置给UIImageView的时候,把这个标记设为true:
// 假设这是相机回调里设置图片的代码 secondImageView.image = userTakenImage secondImageView.hasCustomImage = true
发邮件时直接判断这个标记就行:
if !secondImageView.hasCustomImage { // 未替换,还是默认图,不加入邮件 } else { // 已替换,加入邮件 }
方法3:对比图片数据
如果上面两种方法都不适合,你还可以把图片转成Data来对比,这样绝对不会出错:
// 提前把默认图转成Data guard let defaultImageData = defaultImageViewImage?.pngData() else { // 默认图加载失败,做容错处理 return } // 检测时对比当前图的Data if let currentImageData = secondImageView.image?.pngData(), currentImageData == defaultImageData { // 是默认图,不加入邮件 } else { // 不是默认图,加入邮件 }
不过这种方法会消耗一点性能,毕竟要转Data,但对于寻宝应用的场景来说完全没问题。
提醒一下:不管用哪种方法,都要确保默认图片的加载是统一的,别在不同地方用UIImage(named:)重复加载,不然可能会出现同一个图片但实例不同的情况,导致对比失败哦!
内容的提问来源于stack exchange,提问作者DJFriar
相关产品推荐
相关产品推荐

