美文网首页
Swift实现二维码扫描

Swift实现二维码扫描

作者: captain_Lu | 来源:发表于2016-09-12 16:28 被阅读181次

    二维码

    第三方库:
    ZXing Android使用多
    ZBar iOS使用多
    提示:以上两个框架都是老牌二维码框架,不过都不支持 64 位

    目前在 iOS 开发中普遍使用苹果的 AVFoundation 框架,但是不支持图片识别功能
    AVFoundation 只支持通过摄像头扫描识别

    识别的原理

    扫描原理.png

    实现的效果

    扫描界面.PNG

    界面搭建

    这里采用的是storyboard实现界面

    界面结构.png

    扫描动画

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        scanAnimation()
    }
    func scanAnimation() {
        // 每次开始之前先停止图层动画
        scanImage.layer.removeAllAnimations()
        // 设定动画初始约束
        //topScanConstraint 为扫描网格顶部距离父控件的约束
        //heightConstraint为容器父控件的高度约束
        self.topScanConstraint.constant = -heightConstraint.constant
        // 更新视图布局
        self.view.layoutIfNeeded()
    
        // 开始动画
        UIView.animateWithDuration(2.0, animations: { () -> Void in
            self.topScanConstraint.constant = self.heightConstraint.constant
            UIView.setAnimationRepeatCount(MAXFLOAT)
            self.view.layoutIfNeeded()
        })
    }
    
    // MARK: - UITabBarDelegate
        func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
            // 1.修改容器的高度
            if item.tag == 1{
    //            print("二维码")
                self.containerHeightCons.constant = 300
            }else{
                print("条形码")
                self.containerHeightCons.constant = 150
            }
            // 2.停止动画
            self.scanLineView.layer.removeAllAnimations()
            
            // 3.重新开始动画
            startAnimation()
        }
    

    二维码扫描

    • 懒加载创建会话
        private lazy var session :AVCaptureSession =
            {
                let session = AVCaptureSession();
                return session;
        }()
    
    • 获取输入设备
        private lazy var input :AVCaptureDeviceInput? =
            {
                let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    
                let videoInput: AVCaptureDeviceInput?
                do {
                    videoInput = try AVCaptureDeviceInput(device: device)
                    return videoInput!;
                } catch {
                    print(error);
                    return nil;
                }
        }();
    
    • 获取输出设备
        private lazy var output:AVCaptureMetadataOutput =
            {
                let output = AVCaptureMetadataOutput();
                return output;
        }()
    
    • 预览图层
        lazy var previewLayer: AVCaptureVideoPreviewLayer = {
            let previewLayer = AVCaptureVideoPreviewLayer(session: self.session);
            previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
            previewLayer.frame = self.view.bounds
            return previewLayer;
        }()
    
    • 开始扫描
    private func starScan()
        {
            //1.判断是否能够将输入设备添加到会话中
            if !session.canAddInput(input) {
                return;
            }
    
            //2.判断是否能够将输出设备添加到会话中
            if !session.canAddOutput(output) {
                return;
            }
    
            //3.输入设备和输出设备添加到会话中
            session.addInput(input);
            session.addOutput(output);
    
            //4.设置能输出的数据类型
            //注意:设置输出数据类型必须在添加到会话之后
            output.metadataObjectTypes = output.availableMetadataObjectTypes;//所有支持的类型
    
            //5.0 设置输出代理
            output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
    
            //6.0添加图层
            view.layer.insertSublayer(previewLayer, atIndex: 0)
    
            //7.0开始
            session .startRunning();
        }
    
    • AVCaptureMetadataOutputObjectsDelegate代理回调, 打印扫描结果
     func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!)
        {
            print(metadataObjects.last?.stringValue);
        }
    

    相关文章

      网友评论

          本文标题:Swift实现二维码扫描

          本文链接:https://www.haomeiwen.com/subject/yuvpettx.html