Qr Scanner
Muhriddinbek SamidovAssalomu 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:

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.