UIViewRepresentable调用updateUIView后对应UIView未更新问题排查
问题原因
通过CICode128BarcodeGenerator生成的CIImage默认是刚好容纳条码的最小尺寸,高度仅几十像素,同时UIImageView未设置适配模式,图片无法正常拉伸适配你设定的视图大小,就会出现updateUIView触发但视图看不到变化的情况。
修复方案
需要修改两处代码:
- 给
BarCodeView中的UIImageView设置适配模式,让条码可以等比例填充视图
struct BarCodeView: UIViewRepresentable { @Binding var barcode: String func makeUIView(context: Context) -> UIImageView { let imageView = UIImageView() // 新增适配模式配置 imageView.contentMode = .scaleAspectFit return imageView } func updateUIView(_ uiView: UIImageView, context: Context) { uiView.image = UIImage(barcode: barcode) } }
- 放大生成的条码原始尺寸,避免Retina屏幕上显示模糊
extension UIImage { convenience init?(barcode: String) { let data = barcode.data(using: .ascii) guard let filter = CIFilter(name: "CICode128BarcodeGenerator") else { return nil } filter.setValue(data, forKey: "inputMessage") guard let ciImage = filter.outputImage else { return nil } // 新增缩放逻辑,10倍放大可根据实际需求调整 let scaledImage = ciImage.transformed(by: CGAffineTransform(scaleX: 10, y: 10)) self.init(ciImage: scaledImage) } }
修改完成后点击按钮即可看到条码正常更新。
内容的提问来源于stack exchange,提问作者koza
相关产品推荐
相关产品推荐

