IOS 11 ve Swift 4.0 ile QR Kod ve Barkod Okuyucu Oluşturma

IOS 11 ve Swift 4.0 ile QR Kod ve Barkod Okuyucu Oluşturma

IOS işletim sisteminde Swift programlama ile ilgili ilk dersimizi, hakkında Türkçe içerik hiç bulamadığım, İngilizce içerik ararken bile zorlandığım bir konuda oluşturmak istedim. IOS 11 ve Swift 4.0 kullanarak QR Kod ve Barkod okuyucu program yazma.

QR kod okuyucumuz uygulamanın ana ekranında direkt çıkmasın diye “ScannerViewController” adlı bir class oluşturarak onun içerisine ekledim. Bu sayfaya geçişi de “TabBar” üzerinden gerçekleştirdim. Siz böyle bir geçiş gerçekleştirmeyecekseniz kodun ilk kısmındaki “required init” ile başlayan alanı kaldırabilirsiniz.

import AVFoundation
import UIKit

class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    required init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
        tabBarItem = UITabBarItem(title: "QR Code", image: UIImage(named: "if_shopping"), tag: 2)
    }
    class CameraView: UIView {
        override class var layerClass: AnyClass {
            get {
                return AVCaptureVideoPreviewLayer.self
            }
        }
        
        override var layer: AVCaptureVideoPreviewLayer {
            get {
                return super.layer as! AVCaptureVideoPreviewLayer
            }
        }
    }
    var cameraView: CameraView!
    override func loadView() {
        cameraView = CameraView()
        
        view = cameraView
    }
    let session = AVCaptureSession()
    let sessionQueue = DispatchQueue(label: AVCaptureSession.self.description(), attributes: [], target: nil)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        session.beginConfiguration()
        
        let videoDevice = AVCaptureDevice.default(for: .video)
                                1
        if (videoDevice != nil) {
            let videoDeviceInput = try? AVCaptureDeviceInput(device: videoDevice!)
            
            if (videoDeviceInput != nil) {
                if (session.canAddInput(videoDeviceInput!)) {
                    session.addInput(videoDeviceInput!)
                }
            }
            
            let metadataOutput = AVCaptureMetadataOutput()
            
            if (session.canAddOutput(metadataOutput)) {
                session.addOutput(metadataOutput)
                
                metadataOutput.metadataObjectTypes = [
                    .ean13,
                    .qr
                ]
                
                metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            }
        }
        
        session.commitConfiguration()
        
        cameraView.layer.session = session
        cameraView.layer.videoGravity = .resizeAspectFill
        let videoOrientation: AVCaptureVideoOrientation
        switch UIApplication.shared.statusBarOrientation {
        case .portrait:
            videoOrientation = .portrait
            
        case .portraitUpsideDown:
            videoOrientation = .portraitUpsideDown
            
        case .landscapeLeft:
            videoOrientation = .landscapeLeft
            
        case .landscapeRight:
            videoOrientation = .landscapeRight
            
        default:
            videoOrientation = .portrait
        }
        
        cameraView.layer.connection?.videoOrientation = videoOrientation
        
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        sessionQueue.async {
            self.session.startRunning()
        }
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        
        sessionQueue.async {
            self.session.stopRunning()
        }
    }
    
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        
        // Update camera orientation
        let videoOrientation: AVCaptureVideoOrientation
        switch UIDevice.current.orientation {
        case .portrait:
            videoOrientation = .portrait
            
        case .portraitUpsideDown:
            videoOrientation = .portraitUpsideDown
            
        case .landscapeLeft:
            videoOrientation = .landscapeRight
            
        case .landscapeRight:
            videoOrientation = .landscapeLeft
            
        default:
            videoOrientation = .portrait
        }
        
        cameraView.layer.connection?.videoOrientation = videoOrientation
    }
    
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        if (metadataObjects.count > 0 && metadataObjects.first is AVMetadataMachineReadableCodeObject) {
            let scan = metadataObjects.first as! AVMetadataMachineReadableCodeObject
            
            let alertController = UIAlertController(title: "Barcode Scanned", message: scan.stringValue, preferredStyle: .alert)
            
            alertController.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
            
            present(alertController, animated: true, completion: nil)
        }
    }

}

Kodumuz uygulama içerisinde çalışırken kamera izni isteyecektir. Bu izin ekranını da Info.plist dosyası üzerinde düzenlemeliyiz.

Yukarıdaki ekran görüntüsünde gördüğünüz gibi “Privacy – Camera Usage Description” satırını ekleyip, bu satırın değerine kendi onay sorumuzu yazıyoruz.

Son olarak, bu class için bir Main.storyboard’da boş bir viewcontroller yaratmanız yeterli olacaktır. O View Controller ile oluşturduğumuz “ScannerViewController” class’ını bağlayıp uygulamanızı çalıştırınız. Mac’inizdeki simülatörde düzgün çalışmayabilir. Bunun için bir iPhone’u simülatör olarak kullanmalısınız.

Sitemizde yayınladığımız ilk eğitim içeriği olduğu için anlatımdaki kusurlarımızı affedin. Eksik kalan ya da anlamadığınız kısımları yorum alanından sorabilirsiniz.

 

 

Bu gönderiyi paylaş

Call Now Button