苹果从IOS7以后实现了扫描功能,不在借助第三库就能实现扫码功能,且代码量也小,使用这原生功能,在效率与准确率上都比第三库提高了很多,在此记录下整个过程。
一、定义几个与扫码功能相关的变量,记得要引入AVFoundation库
//私有变量
private var device: AVCaptureDevice!
private var input: AVCaptureInput!
private var output: AVCaptureMetadataOutput!
private var session: AVCaptureSession!
private var preview: AVCaptureVideoPreviewLayer!
private let ScreenWidth = UIScreen.mainScreen().bounds.size.width
private let ScreenHeight = UIScreen.mainScreen().bounds.size.height
这上面的!是要确保你在使用前已经赋值了,一般常见的是?,这是基础知识了。
二、初始化以上变量,并启动扫码功能
func initDevice(){
// Device
self.device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
// Input
do{
self.input = try AVCaptureDeviceInput(device: self.device)
}catch{
print("Input 初始化失败")
return
}
// Output
self.output = AVCaptureMetadataOutput()
self.output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
self.output.rectOfInterest = CGRectMake(((ScreenHeight-220)/2)/ScreenHeight, ((ScreenWidth-220)/2)/ScreenWidth, 220/ScreenHeight, 220/ScreenWidth)//感兴趣的区域,设置为中心,否则全屏可扫
// Session
self.session = AVCaptureSession()
self.session.sessionPreset = AVCaptureSessionPresetHigh
if self.session.canAddInput(self.input){
self.session.addInput(self.input)
}else{
print("Session Add Input 初始化失败")
return
}
if self.session.canAddOutput(self.output){
self.session.addOutput(self.output)
}else{
print("Session Add Output 初始化失败")
return
}
// 条码类型 AVMetadataObjectTypeQRCode
self.output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
// Preview
self.preview = AVCaptureVideoPreviewLayer(session: self.session)
self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill
self.preview.frame = self.view.layer.bounds
self.view.layer.insertSublayer(self.preview, atIndex: 0)
// Start
self.session.startRunning()
}
三、让viewController实现AVCaptureMetadataOutputObjectsDelegate协议,实现其中的方法,只有一个方法了
//MARK: CaptureOutputDelegate
internal func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!){
var stringValue: String?
if metadataObjects.count > 0
{
// 停止扫描
self.session.stopRunning()
if let metadataObject = metadataObjects.first as? AVMetadataMachineReadableCodeObject{
stringValue = metadataObject.stringValue
}
}
}
至此,扫码就结束了,代码量少,且比第三方库更高效。
源代码github地址