SwiftUI: Generate QR Code
The CoreImage framework provides features to create a QR code. Importing `CIFilterBuiltins` adds access to the function `CIFilter.qrCodeGenerator()`, which returns a QR generator instance.
The data to be encoded in a QR code is defined with the property `message`. The correction level of the QR code is defined with `correctionLevel`. The property `outputImage` produces a `CIImage`.
import SwiftUI
import CoreImage
import CoreImage.CIFilterBuiltins
import UIKit
struct SampleQRCodeView: View {
@State private var inputText: String = ""
@State private var qrImage: UIImage? = nil
var body: some View {
VStack(alignment: .leading, spacing: 16) {
Text("Sample QRCode View")
.font(.largeTitle)
Spacer()
TextField("Text to encode", text: $inputText, onCommit: {
generateQRCode()
})
.padding(8)
.background {
RoundedRectangle(cornerRadius: 12)
.fill(Color.white)
}
Button(action: generateQRCode) {
Text("Generate")
.padding()
.frame(maxWidth: .infinity)
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
Spacer()
VStack(alignment: .center) {
if let image = qrImage {
Image(uiImage: image)
.resizable()
.interpolation(.none)
.scaledToFit()
.frame(width: 300, height: 300)
} else {
Color.clear
.frame(width: 300, height: 300)
}
}
.padding(12)
.background {
RoundedRectangle(cornerRadius: 12)
.fill(Color(white: 1))
}
.frame(maxWidth: .infinity)
Spacer()
Spacer()
}
.padding()
.background {
Color(white: 0.9)
.ignoresSafeArea()
}
}
func generateQRCode() {
let context = CIContext()
let qrCodeGenerator = CIFilter.qrCodeGenerator()
guard let data = inputText.data(using: .utf8) else { return }
qrCodeGenerator.message = data
qrCodeGenerator.correctionLevel = "L"
guard let ciImage = qrCodeGenerator.outputImage else { return }
guard let cgImage = context.createCGImage(ciImage, from: ciImage.extent) else { return }
qrImage = UIImage(cgImage: cgImage)
}
}
#Preview {
SampleQRCodeView()
}