Search code examples
swiftstoryboardqr-code

Add generator to project


I have a swift struct:

import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins

    struct Qrview : View {
        let context = CIContext()
        let filter = CIFilter.qrCodeGenerator()
        var url : String
        
        var body: some View {
            Image(uiImage: genearteQrcodeimage(url: url))
        }
        func genearteQrcodeimage(url : String) -> UIImage {
            let data = Data(url.utf8)
            filter.setValue(data, forKey: "Inputmessage")
            if let qrcodeImage = filter.outputImage {
                if let qrcodeImage  = context.createCGImage(qrcodeImage, from: qrcodeImage.extent){
                    return UIImage(cgImage: qrcodeImage)
                    
                }
            }
            return UIImage(systemName: "mark") ?? UIImage()
        }
    }

and a view controller:

import UIKit


    class ViewController: UIViewController {
        @IBOutlet weak var QRImage: UIView!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        
        }
    
    
    }

According to this video

https://www.youtube.com/watch?v=bKOdFVirgU0

It will generate a qrcodeimage. How can I add this generated qrcodeimage to my view (QRImage) created in storyboard.


Solution

  • You can use the view by using UIHostingController. First, you need to import swiftUI in your viewcontroller as below:

    import UIKit
    import SwiftUI
    
    class EventsViewController: UIViewController {
    
        @IBOutlet weak var QRImage: UIView!
        override func viewDidLoad() {
            super.viewDidLoad()
            // Example of use
            let childView = UIHostingController(rootView: Qrview(url: "www.google.com"))
            addChild(childView)
            childView.view.frame = QRImage.bounds
            QRImage.addSubview(childView.view)
            childView.didMove(toParent: self)
        }
    
    }
    

    BTW, you need to set frame and filter key from your SwiftUI view. Becareful about the key-value name (case sensitive):

    filter.setValue(data, forKey: "inputMessage")

    import Foundation
    import SwiftUI
    import CoreImage.CIFilterBuiltins
    
        struct Qrview : View {
            let context = CIContext()
            let filter = CIFilter.qrCodeGenerator()
            var url : String
            
            var body: some View {
                Image(uiImage: genearteQrcodeimage(url: url))
                    .resizable().frame(width: 200, height: 200, alignment: .center)
            }
            func genearteQrcodeimage(url : String) -> UIImage {
                let data = Data(url.utf8)
                filter.setValue(data, forKey: "inputMessage")
                if let qrcodeImage = filter.outputImage {
                    if let qrcodeImage  = context.createCGImage(qrcodeImage, from: qrcodeImage.extent){
                        return UIImage(cgImage: qrcodeImage)
                        
                    }
                }
                return UIImage(systemName: "mark") ?? UIImage()
            }
        }
    

    Here is the output: enter image description here