/QRCodeSwiftUIExample

This demo shows use of SwiftQRCodeScanner in SwiftUI

Primary LanguageSwift

QRCodeSwiftUIExample

This demo shows use of SwiftQRCodeScanner using SwiftUI. This example uses Swift Package Manager as dependency manager.

Code

ContentView.swift

import SwiftUI
import SwiftQRCodeScanner

struct ContentView: View {
    @State private var isPresented = false
    @State private var showExtraOptions = false
    @State private var scannedValue: String = ""
    @State private var textColor: Color = .black
    @State private var result: Result<String, QRCodeError>?
    
    var body: some View {
        VStack(spacing: 30) {
            Text(scannedValue)
                .foregroundColor(textColor)
            Button("Scan QR Code") {
                self.isPresented = true
            }
            Button("Scan QR Code with Extra Options") {
                self.showExtraOptions = true
                self.isPresented = true
            }
        }
        .sheet(isPresented: $isPresented) {
            QRScanner(showExtraOptions: $showExtraOptions, result: self.$result)
        }
        .onChange(of: result) { newValue in
            guard let unwrappedResult = newValue else { return }
            switch unwrappedResult {
            case .success(let qrCodeString):
                self.scannedValue = qrCodeString
                self.textColor = .black
            case .failure(let qrCodeError):
                self.scannedValue = qrCodeError.localizedDescription
                self.textColor = .red
            }
        }
    }
}

QRScanner.swift

import UIKit
import SwiftUI
import SwiftQRCodeScanner

struct QRScanner: UIViewControllerRepresentable {
    @Binding var showExtraOptions: Bool
    @Binding var result: Result<String, QRCodeError>?
    @Environment(\.presentationMode) var presentationMode
    
    func makeCoordinator() -> QRScanner.Coordinator {
        return Coordinator(self)
    }
    
    func makeUIViewController(context: Context) -> QRCodeScannerController {
        var picker: QRCodeScannerController?
        if showExtraOptions {
            var configuration = QRScannerConfiguration()
            configuration.cameraImage = UIImage(named: "switch-camera-button")
            configuration.flashOnImage = UIImage(named: "flash")
            configuration.galleryImage = UIImage(named: "photos")
            picker = QRCodeScannerController(qrScannerConfiguration: configuration)
        } else {
         picker = QRCodeScannerController()
        }
        picker!.delegate = context.coordinator
        return picker!
    }
    
    func updateUIViewController(_ uiViewController: QRCodeScannerController, context: Context) {}
}

extension QRScanner {
    class Coordinator: NSObject, QRScannerCodeDelegate {
        @Environment(\.presentationMode) var presentationMode
        var parent: QRScanner
        
        init(_ parent: QRScanner) {
            self.parent = parent
        }
        
        func qrScanner(_ controller: UIViewController, didScanQRCodeWithResult result: String) {
            parent.result = .success(result)
            parent.presentationMode.wrappedValue.dismiss()
        }
        
        func qrScanner(_ controller: UIViewController, 
                       didFailWithError error: SwiftQRCodeScanner.QRCodeError) {
            parent.result = .failure(error)
            parent.presentationMode.wrappedValue.dismiss()
        }
        
        func qrScannerDidCancel(_ controller: UIViewController) {
            print("QR Controller did cancel")
        }
    }
}