UIImageView设置ciimage生成的图片时,第二次设置不会更新

业务开发过程中,遇到生成的二维码图片第二次设置时不会更新,查询许多资料发现是由于直接使用了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
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容