IOS实现原生二维码扫码(swift版)

苹果从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地址

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值