• iOS二维码扫描的实现(Swift)


    随着二维码的普遍使用,二维码扫描也成为了很多app的一个基本功能,本篇主要来介绍一下如何实现一个简单的二维码扫描功能。本文使用了XCode自带的AVFoundation

    库,利用Swfit语言实现。

    实现的步骤如下:

    1.获取视频设备(Video)

      在二维码扫描中,我们的输入流是视频。我们需要enable视频设备来获取相应的元数据。

    2. 创建Session来处理视频的输入输出流

    3. 创建输入输出流,并添加至Session中

    4. 处理二维码数据

      该方法是AVCaptureMetadataOutputObjectsDelegate的一个成员方法,我们需要实现它

    ~~~~~~~~~~~~~~~~~~~~~~~~~我是代码:)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    //
    //  ViewController.swift
    //  QrCodeTest
    //
    //  Created by XuAlvin on 2/2/16.
    //  Copyright © 2016年 XuAlvin. All rights reserved.
    //
    
    import UIKit
    import AVFoundation
    class ViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate {
    
        var session:AVCaptureSession?
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            //获取摄像设备,注意是Video而不是Audio
            let device = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
            //初始化AV Session来协调和处理AV的输入和输出流
            let session = AVCaptureSession()
            
            //创建输入流
            let input:AVCaptureDeviceInput? = try! AVCaptureDeviceInput(device: device)
            
            if session.canAddInput(input){
                session.addInput(input)
            }
            
            //创建输出流
            let output:AVCaptureMetadataOutput = AVCaptureMetadataOutput()
            if session.canAddOutput(output){
                session.addOutput(output)
                //设置输出流代理,从接收端收到的所有元数据都会被传送到delegate方法,所有delegate方法均在queue中执行
                output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
                //设置元数据的类型,这里是二维码QRCode
                output.metadataObjectTypes = [AVMetadataObjectTypeQRCode]
            }
            
            //创建视频设备拍摄视频区域,本例中是全屏
            let layer:AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session)
            layer.videoGravity = AVLayerVideoGravityResizeAspectFill
            layer.frame=self.view.layer.bounds
            self.view.layer.insertSublayer(layer, atIndex: 0)
            //开始采集视频数据
            session.startRunning()
            }
        
        
            //实现AVCaptureMetadataOutputObjectsDelegate的成员方法来处理二维码信息
            func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
                session?.stopRunning()
                
                //获取二维码信息元数据
                if let metadataObjects = metadataObjects.first{
                    let readableObject = metadataObjects as! AVMetadataMachineReadableCodeObject
                    
                    //添加震动
                    AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
                    //弹出二维码信息
                    let alertCtl : UIAlertController = UIAlertController(title: "二维码信息", message: readableObject.stringValue, preferredStyle: UIAlertControllerStyle.Alert)
                    
                    //添加action到uialertcontroller,action是UIalertcontroller上的按钮操作,建议至少添加一个,如果不添加,alertcontroller就没有相应的按钮退出
                    
                    let alertAction : UIAlertAction = UIAlertAction(title: "Action", style: UIAlertActionStyle.Default, handler: { (param : UIAlertAction!) -> Void in
                        print("I am alert action")
    
                        
                    })
                    alertCtl.addAction(alertAction)
                    //显示alert controller
                    self.presentViewController(alertCtl, animated: true, completion: nil)
                }
            }
    }
    

      

  • 相关阅读:
    Jmeter后置处理器之Json提取器
    Jmeter体系结构-事务控制器
    一款免费的自动化测试工具:AirtestProject
    jsonpath-rw处理json对象
    MySQL常用SQL
    Git使用
    charles的mock功能
    Django项目之blog表设计(二)
    Django小项目之blog(一)
    selenium无界面浏览器,访问百度搜索为例
  • 原文地址:https://www.cnblogs.com/AlwinXu/p/5095754.html
Copyright © 2020-2023  润新知