• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

随着二维码的普遍使用,二维码扫描也成为了很多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)
            }
        }
}

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【Swift学习】Swift编程之旅---集合类型之数组(六)发布时间:2022-07-13
下一篇:
用Swift开发二维码扫描器教程发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap