Skip to content

vinodiOS/QRCodeSwiftUIExample

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 

Repository files navigation

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")
        }
    }
}

About

This demo shows use of SwiftQRCodeScanner in SwiftUI

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages