业务开发过程中,遇到生成的二维码图片第二次设置时不会更新,查询许多资料发现是由于直接使用了
UIImage(ciImage: ciImage)生成的图片导致的,使用UIImage(cgImage: cgImage)生成的就可以,特记录下
参考资料:
imageView.image = UIImage(ciImage: ) won t update a second time [duplicate]
CGImage UIImage CIImage 区别
Core Image 你需要了解的那些事~
iOS开发—核心图像教程:入门
UIImage(ciImage: xxx) CIImage生成的图片第二次设置到UIImageView上时不会更新展示
UIImage(cgImage: xxx) CGImage生成的图片第二次设置到UIImageView上时可以正常更新展示
完整生成二维码图片的代码
static func generateQRImage(_ text: String?,
widthAndHeight: CGFloat = 200,
color: UIColor = .black,
backgroundColor: UIColor = .white) -> UIImage? {
// 判断内容不为空
guard let content = text, !content.isEmpty else {
return nil
}
guard let data = content.data(using: String.Encoding.utf8) else {
return nil
}
// 二维码滤镜
guard let filter = CIFilter(name: "CIQRCodeGenerator") else {
return nil
}
filter.setValue(data, forKey: "inputMessage")
filter.setValue("H", forKey: "inputCorrectionLevel")
guard let filterCIImage = filter.outputImage else {
return nil
}
// 颜色滤镜
guard let colorFilter = CIFilter(name: "CIFalseColor") else {
return nil
}
colorFilter.setValue(filterCIImage, forKey: kCIInputImageKey)
colorFilter.setValue(CIColor(cgColor: color.cgColor), forKey: "inputColor0")
colorFilter.setValue(CIColor(cgColor: backgroundColor.cgColor), forKey: "inputColor1")
guard let colorFilterCIImage = colorFilter.outputImage else {
return nil
}
// 尺寸转换
let width = colorFilterCIImage.extent.size.width
let scale = (width == 0) ? 1 : (widthAndHeight / width)
let transformCIImage = colorFilterCIImage.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
// 生成图片
// 使用ciImage生成的图片在第二次设置到UIImageView上不会更新展示
// return UIImage(ciImage: transformCIImage)
// 使用cgImage生成的图片在第二次设置到UIImageView上才会更新展示
let context = CIContext()
guard let cgImage = context.createCGImage(transformCIImage, from: transformCIImage.extent) else {
return nil
}
return UIImage(cgImage: cgImage)
}
记录下View常用的方法
extension UIView {
convenience init(color: UIColor?, radius: Float? = nil) {
self.init()
if let color = color {
self.backgroundColor = color
}
if let radius = radius {
self.my_radius = CGFloat(radius)
}
}
var my_radius: CGFloat {
get {
return 0
}
set {
self.layer.masksToBounds = true
self.layer.cornerRadius = newValue
}
}
var my_capure: UIImage {
get {
let render = UIGraphicsImageRenderer(bounds: bounds)
return render.image { renderContext in
layer.render(in: renderContext.cgContext)
}
}
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END






















暂无评论内容