Building a Barcode and QR Code Reader in Swift 3 With XCode9 and iOS 11
In this tutorial we are study about to Scan barcode and read the barcode value.
Step : 1 Add the AVFoundation framework in your swift file as below.
Step : 1 Add the AVFoundation framework in your swift file as below.
import AVFoundation
Step : 2 Add the delegate AVCaptureMetadataOutputObjectsDelegate delegate which is use to get the metadata of the barcode. Here we can read the barcode value and use it.
class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
Step : 3 Take one view for Scan the barcode. Button btnStartStop for start and stop the barcode scan. and label for display value of barcode.@IBOutlet weak var viewPreview: UIView!
@IBOutlet weak var lblString: UILabel!
@IBOutlet weak var btnStartStop: UIButton!
Step : 4 Create an object of AVCaptureSession and AVCaptureVideoPreviewLayer. Also take one variable isReading to check barcode scanning is start or stop.var captureSession: AVCaptureSession?
var videoPreviewLayer: AVCaptureVideoPreviewLayer!
var isReading: Bool = false
Step : 5 In ViewDidLoad method. Set the property of components(views) and initialize the variable. See the below code.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
viewPreview.layer.cornerRadius = 5;
btnStartStop.layer.cornerRadius = 5;
captureSession = nil;
lblString.text = "Barcode discriptio...";
}
Step : 6 Start Scan func startReading() -> Bool {
let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
do {
let input = try AVCaptureDeviceInput(device: captureDevice)
captureSession = AVCaptureSession()
captureSession?.addInput(input)
// Do the rest of your work...
} catch let error as NSError {
// Handle any errors
print(error)
return false
}
videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
videoPreviewLayer.frame = viewPreview.layer.bounds
viewPreview.layer.addSublayer(videoPreviewLayer)
/* Check for metadata */
let captureMetadataOutput = AVCaptureMetadataOutput()
captureSession?.addOutput(captureMetadataOutput)
captureMetadataOutput.metadataObjectTypes = captureMetadataOutput.availableMetadataObjectTypes
print(captureMetadataOutput.availableMetadataObjectTypes)
captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
captureSession?.startRunning()
return true
}
Step : 7 Stop Scan
func stopReading() {
captureSession?.stopRunning()
captureSession = nil
videoPreviewLayer.removeFromSuperlayer()
}
Step : 8 After the start scan successfully , The AVCaptureMetadataOutputObjectsDelegate method gives the metadata. So we can read the value of barcode and use the barcode value.
func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
for data in metadataObjects {
let metaData = data as! AVMetadataObject
print(metaData.description)
let transformed = videoPreviewLayer?.transformedMetadataObject(for: metaData) as? AVMetadataMachineReadableCodeObject
if let unwraped = transformed {
print(unwraped.stringValue)
lblString.text = unwraped.stringValue
btnStartStop.setTitle("Start", for: .normal)
self.performSelector(onMainThread: #selector(stopReading), with: nil, waitUntilDone: false)
isReading = false;
}
}
}
Step : 9 Start/Stop button will start the barcode and stop to read barcode. when stop then object set to be nil.
@IBAction func startStopClick(_ sender: UIButton) {
if !isReading {
if (self.startReading()) {
btnStartStop.setTitle("Stop", for: .normal)
lblString.text = "Scanning for QR Code..."
}
}
else {
stopReading()
btnStartStop.setTitle("Start", for: .normal)
}
isReading = !isReading
}
Step : 10 Adding the camera permission in info.plist file. See the below image. Also refer the link How To Add Permission in Info.plist file.
Demo : Download
Thanks.
Thanks.
Building a Barcode and QR Code Reader in Swift 3 With XCode9 and iOS 11
Reviewed by KIRIT MODI
on
22:21:00
Rating:
No comments: