Qr Scanner

Qr Scanner

Muhriddinbek Samidov

Assalomu aleykum!

iOS developmentda ko'p foydalaniladigan QR va barcode-larni scanner qilish aslida ko'ringanidan osonroq!

Keling sizlar bilan birga mini project yaratib ko'ramiz:

Buning uchun yangi iOS project yarating va AppDelegate file-da quydagilarni o'zgarishlarni kiritamiz:

class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame:
    UIScreen.main.bounds)
    window?.rootViewController =
    QrScannerViewController()
     
    return true
  }
}


Endi QrScannerViewController-ni yaratamiz:

import UIKit
import AVFoundation

class QrScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
   
  var captureSession: AVCaptureSession!
  var previewLayer: AVCaptureVideoPreviewLayer!
  var stillImageOutput: AVCaptureStillImageOutput!
   
  override func viewDidLoad() {
    super.viewDidLoad()
    self.setUpCamera()
  }
  func setUpCamera() {
    captureSession = AVCaptureSession()
    guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
    let videoInput: AVCaptureDeviceInput
    do {
      videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
    } catch {
      return
    }
    if (captureSession.canAddInput(videoInput)) {
      captureSession.addInput(videoInput)
    } else {
      failed()
      return
    }
    let metadataOutput = AVCaptureMetadataOutput()
    if (captureSession.canAddOutput(metadataOutput)) {
      captureSession.addOutput(metadataOutput)
      metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
      metadataOutput.metadataObjectTypes =
      [.qr, .ean13, .ean8, .code128, .aztec, .code128, .code39, .code93, .code39Mod43, .dataMatrix ,.ean13, .face]
    } else {
      failed()
      return
    }
    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
    previewLayer.frame = view.layer.bounds
    previewLayer.videoGravity = .resizeAspectFill
    view.layer.addSublayer(previewLayer)
    stillImageOutput = AVCaptureStillImageOutput()
    if captureSession.canAddOutput(stillImageOutput) {
      captureSession.addOutput(stillImageOutput)
    }
    captureSession.startRunning()
  }
   
  func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    if let metadataObject = metadataObjects.first {
      guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }
      guard let stringValue = readableObject.stringValue else { return }
      self.captureSession.stopRunning()
      self.showResult((stringValue, nil))
    }
  }
   
  func failed() {
    print("Unable to access camera!")
  }
   
  func showResult(_ result: (String, UIImage?)) {
    let resultViewController = ResultViewController()
    resultViewController.result = result
    present(resultViewController, animated: true, completion: nil)
  }
}


App run bo'lganda camera-ga access qilish jarayonida xatolik yuz bermasligi uchun Info.plist file ga permission yozamiz:

  <key>NSCameraUsageDescription</key>

  <string>This app requires access to the camera to scan QR codes and barcodes.</string>

Natijani ko'rsatish uchun ResultViewController-ni yaratamiz:

import UIKit

class ResultViewController: UIViewController {
     var result: (String, UIImage?)!
   
  private let imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFit
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
  }()
   
  private let resultLabel: UILabel = {
    let label = UILabel()
    label.textAlignment = .center
    label.numberOfLines = 0
    label.textColor = .black
    label.font = .boldSystemFont(ofSize: 24)
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
  }()
   
  override func viewDidLoad() {
    super.viewDidLoad()
    self.initViews()
  }
  private func initViews() {
    view.backgroundColor = .white
    setupImageView()
    setupResultLabel()
    resultLabel.text = result.0
    imageView.image = result.1 ?? result.0.generateQRCode()
  }
   
  private func setupImageView() {
      view.addSubview(imageView)
      NSLayoutConstraint.activate([
        imageView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50),
        imageView.widthAnchor.constraint(equalToConstant: 250),
        imageView.heightAnchor.constraint(equalToConstant: 250)
      ])
    }

    private func setupResultLabel() {
      view.addSubview(resultLabel)
      NSLayoutConstraint.activate([
        resultLabel.topAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 20),
        resultLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
        resultLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)
      ])
    }
}

String dan QR image yasash uchun extension yozamiz:

extension String {
  func generateQRCode() -> UIImage? {
    let ciContext = CIContext(options: nil)
    guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return nil }
    let qrData = self.data(using: String.Encoding.ascii)
    qrFilter.setValue(qrData, forKey: "inputMessage")
    guard let qrImage = qrFilter.outputImage else { return nil }
    let scaleX = UIScreen.main.scale
    let transformedImage = qrImage.transformed(by: CGAffineTransform(scaleX: scaleX, y: scaleX))
    guard let cgImage = ciContext.createCGImage(transformedImage, from: transformedImage.extent) else { return nil }
    return UIImage(cgImage: cgImage)
  }
}

Uraaa! Tayyor! Faqat Run(Command+R) qilish qoldi:

Scanner natijasi

Qiziqmi? Bizni telegram Swift Academy orqali kuzatib boring.

Ushbu code Barcode(EAN) lar uchun ham o'rinli bo'lib, barcode orginalligi va maskalari xaqida ushbu link orqali batafsil ma'lumot olishingiz mumkin

Eslatib o'tamiz tez kunlarda iOS app development kurslarimizni boshlaymiz, batafsil ma'lumot telegram orqali olishingiz mumkin.

Report Page