使用 SwiftUI 生成二维码显示空图片

nOk*_*nOk 4 qr-code cifilter swiftui

我试图在我的应用程序中生成一个二维码。问题是每当我做图片时,图片只是一个空方块。我将代码简化为基础,以尝试展示我的问题。

struct ContentView: View {
    @State var image: Image = Image(systemName: "circle.fill")

    var body: some View {
        VStack {
            image
                .resizable()
                .aspectRatio(contentMode: .fill)
                .frame(width: 200, height: 200)
                .background(Color.green)

        }.onAppear {
            let myString = "Hello There"
            let data = myString.data(using: String.Encoding.ascii)
            guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
            qrFilter.setValue(data, forKey: "inputMessage")
            guard let qrImage = qrFilter.outputImage else { return }
            let transform = CGAffineTransform(scaleX: 10, y: 10)
            let scaledQrImage = qrImage.transformed(by: transform)
            self.image = Image(uiImage: UIImage(ciImage: scaledQrImage))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是这样的: 结果截图

Fra*_*gel 11

我想问题在于您CIImage实际上并没有“生产”。你看, aCIImage只是一个需要由 a 渲染成实际位图图像的图像的配方CIContext

(记录不佳)方便的初始化程序UIImage(ciImage:)仅在您分配图像的目标理解图像的像素UIImage尚不存在并且需要首先呈现时才起作用。UIImageView可以处理这个,但 SwiftUIImage似乎没有。

您需要做的是创建一个CIContext(一次,可能作为您的视图的一个属性)并使用它来将您的条形码图像渲染成这样的位图:

let cgImage = self.ciContext.createCGImage(scaledQrImage, from: scaledQrImage.extent)
self.image = Image(uiImage: UIImage(cgImage: cgImage))
Run Code Online (Sandbox Code Playgroud)