`

swift -> 二维码扫描

 
阅读更多

 

参考: http://www.jianshu.com/p/203a48d64e71

代码: https://github.com/cirelir/2DBarcode

 

ViewController.swift

import UIKit


class ViewController: UIViewController{
  
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "首页"
        
        let button = UIButton(frame: CGRect(x: (UIScreen.main.bounds.size.width-100) * 0.5, y: (UIScreen.main.bounds.size.height-30) * 0.5, width: 100, height: 30))
        button.setTitle("扫一扫", for: UIControlState())
        button.setTitleColor(UIColor.blue, for: UIControlState())
        button.addTarget(self, action: #selector(ViewController.buttonAction(_:)), for: UIControlEvents.touchUpInside)
        self.view.addSubview(button)
 
    }
    func buttonAction(_ sender : AnyObject){
        print("扫一扫")
        let  scanner = ScannerViewController()
        self.present(scanner, animated: true, completion: nil);
        //self.navigationController?.pushViewController(scanner, animated: true)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    
}

 

 

ScannerViewController.swift

import UIKit
import AVFoundation

class ScannerViewController: UIViewController,AVCaptureMetadataOutputObjectsDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    //相机显示视图
    let cameraView = ScannerBackgroundView(frame: UIScreen.main.bounds)
    
    
    let captureSession = AVCaptureSession()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //self.title = "扫一扫"
        self.view.backgroundColor = UIColor.black
        //设置导航栏
        /*let barButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.add, target: self, action: #selector(ScannerViewController.selectPhotoFormPhotoLibrary(_:)))
        self.navigationItem.rightBarButtonItem = barButtonItem*/
        let getFrmPhoto = UIButton(frame: CGRect(x: 10, y: 10, width: 200, height: 80));
        getFrmPhoto.backgroundColor = UIColor.red
        getFrmPhoto.setTitle("get From Photo", for: .normal)
        getFrmPhoto.addTarget(self, action: #selector(selectPhotoFormPhotoLibrary(_:)), for: .touchUpInside)
        self.view.addSubview(getFrmPhoto)
        //
        
        cameraView.frame.size.height -= 80;
        cameraView.frame.origin.y += 80;
        self.view.addSubview(cameraView)
        
        //初始化捕捉设备(AVCaptureDevice),类型AVMdeiaTypeVideo
        let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        
        let input :AVCaptureDeviceInput
        
        //创建媒体数据输出流
        let output = AVCaptureMetadataOutput()
        
        //捕捉异常
        do{
            //创建输入流
            input = try AVCaptureDeviceInput(device: captureDevice)
            
            //把输入流添加到会话
            captureSession.addInput(input)
            
            //把输出流添加到会话
            captureSession.addOutput(output)
        }catch {
            print("异常")
        }
        
        //创建串行队列
        let dispatchQueue = DispatchQueue(label: "queue", attributes: [])
        
        //设置输出流的代理
        output.setMetadataObjectsDelegate(self, queue: dispatchQueue)
        
        //设置输出媒体的数据类型
        output.metadataObjectTypes = NSArray(array: [AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]) as [AnyObject]
        
        //创建预览图层
        let videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        
        //设置预览图层的填充方式
        videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        //设置预览图层的frame
        videoPreviewLayer?.frame = cameraView.bounds
        
        //将预览图层添加到预览视图上
        cameraView.layer.insertSublayer(videoPreviewLayer!, at: 0)
        
        //设置扫描范围
        output.rectOfInterest = CGRect(x: 0.2, y: 0.2, width: 0.6, height: 0.6)
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.tabBarController?.tabBar.isHidden = true
        self.scannerStart()
    }
    
    func scannerStart(){
        captureSession.startRunning()
        cameraView.scanning = "start"
    }
    
    func scannerStop() {
        captureSession.stopRunning()
        cameraView.scanning = "stop"
    }
    
    
    //扫描代理方法
    func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
        print("_______")
        
        if metadataObjects != nil && metadataObjects.count > 0 {
            let metaData : AVMetadataMachineReadableCodeObject = metadataObjects.first as! AVMetadataMachineReadableCodeObject
            
            print(metaData.stringValue)
            
            DispatchQueue.main.async(execute: {
                print("相机扫描结果:")
                print(metaData.stringValue);
                //let result = WebViewController()
                //result.url = metaData.stringValue
                
                //self.navigationController?.pushViewController(result, animated: true)
            })
            captureSession.stopRunning()
        }
        
    }
    
    //从相册中选择图片
    func selectPhotoFormPhotoLibrary(_ sender : AnyObject){
        let picture = UIImagePickerController()
        picture.sourceType = UIImagePickerControllerSourceType.photoLibrary
        picture.delegate = self
        self.present(picture, animated: true, completion: nil)
        
    }
    
    //选择相册中的图片完成,进行获取二维码信息    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage]
        
        let imageData = UIImagePNGRepresentation(image as! UIImage)
        
        let ciImage = CIImage(data: imageData!)
        
        let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyLow])
        
        let array = detector?.features(in: ciImage!)
        
        let result : CIQRCodeFeature = array!.first as! CIQRCodeFeature
        
        print("从相册获取结果:");
        print(result.messageString ?? String())
        
    }
}

 

 

ScannerBackgroundView.swift

//
//  ScannerBackgroundView.swift
//  BDHome
//
//  Created by Erwin on 16/6/17.
//  Copyright © 2016年 BDHome. All rights reserved.
//

import UIKit

class ScannerBackgroundView: UIView {
    
    
    //屏幕扫描区域视图
    let barcodeView = UIView(frame: CGRect(x: UIScreen.main.bounds.size.width * 0.2, y: UIScreen.main.bounds.size.height * 0.35, width: UIScreen.main.bounds.size.width * 0.6, height: UIScreen.main.bounds.size.width * 0.6))
    //扫描线
    let scanLine = UIImageView()
    
    var scanning : String!
    var timer = Timer()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        barcodeView.layer.borderWidth = 1.0
        barcodeView.layer.borderColor = UIColor.white.cgColor
        self.addSubview(barcodeView)
        
        //设置扫描线
        scanLine.frame = CGRect(x: 0, y: 0, width: barcodeView.frame.size.width, height: 5)
        scanLine.image = UIImage(named: "QRCodeScanLine")
        
        //添加扫描线图层
        barcodeView.addSubview(scanLine)
        
        self.createBackGroundView()
        
        self.addObserver(self, forKeyPath: "scanning", options: .new, context: nil)
        
        timer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(moveScannerLayer(_:)), userInfo: nil, repeats: true)
        
        
    }
    
    func  createBackGroundView() {
        let topView = UIView(frame: CGRect(x: 0, y: 0,  width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height * 0.35))
        let bottomView = UIView(frame: CGRect(x: 0, y: UIScreen.main.bounds.size.width * 0.6 + UIScreen.main.bounds.size.height * 0.35, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height * 0.65 - UIScreen.main.bounds.size.width * 0.6))
        
        let leftView = UIView(frame: CGRect(x: 0, y: UIScreen.main.bounds.size.height * 0.35, width: UIScreen.main.bounds.size.width * 0.2, height: UIScreen.main.bounds.size.width * 0.6))
        let rightView = UIView(frame: CGRect(x: UIScreen.main.bounds.size.width * 0.8, y: UIScreen.main.bounds.size.height * 0.35, width: UIScreen.main.bounds.size.width * 0.2, height: UIScreen.main.bounds.size.width * 0.6))
        
        topView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
        bottomView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
        leftView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
        rightView.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.4)
        
        let label = UILabel(frame: CGRect(x: 0, y: 10, width: UIScreen.main.bounds.size.width, height: 21))
        label.textAlignment = .center
        label.font = UIFont.systemFont(ofSize: 14)
        label.textColor = UIColor.white
        label.text = "将二维码/条形码放入扫描框内,即自动扫描"
        
        bottomView.addSubview(label)
        
        
        self.addSubview(topView)
        self.addSubview(bottomView)
        self.addSubview(leftView)
        self.addSubview(rightView)
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        if scanning == "start" {
            timer.fire()
        }else{
            timer.invalidate()
        }
    }
    
    
    //让扫描线滚动
    func moveScannerLayer(_ timer : Timer) {
        scanLine.frame = CGRect(x: 0, y: 0, width: self.barcodeView.frame.size.width, height: 12);
        UIView.animate(withDuration: 2) {
            self.scanLine.frame = CGRect(x: self.scanLine.frame.origin.x, y: self.scanLine.frame.origin.y + self.barcodeView.frame.size.height - 10, width: self.scanLine.frame.size.width, height: self.scanLine.frame.size.height);
            
        }
        
    }
}

 

 

其中要用的 扫描时上下移动的 横线  QRCodeScanLine@2x.png 看附件

 

 

 

  • 大小: 1.2 KB
分享到:
评论

相关推荐

    swift-iOS二维码条形码

    总之,"swift-iOS二维码条形码"项目旨在利用Swift和AVFoundation框架,为iOS应用提供便捷的条码和二维码扫描功能,并且能够处理本地相册中的条码图片。通过封装这些功能,开发者可以轻松集成到自己的应用中,提高...

    Swift-iOS原生二维码扫描识别图片中的二维码信息

    在iOS应用开发中,Swift语言提供了强大的功能来处理二维码扫描和识别。本教程将深入讲解如何使用Swift原生API实现二维码扫描与识别,同时提供扫描动画和夜间模式(手电筒功能),使得用户体验更加友好。 首先,我们...

    Go-RHScan-实现二维码扫描功能含各种UI手势放大缩小镜头仿微信扫码放大

    本项目"Go-RHScan-实现二维码扫描功能含各种UI手势放大缩小镜头仿微信扫码放大"是针对这一需求而设计的,它采用Swift语言编写,特别关注用户体验和界面交互。以下是该项目的主要知识点: 1. **二维码扫描框架**: ...

    ios-原生二维码扫描支付宝效果.zip

    在iOS开发中,实现原生的二维码扫描功能并集成支付宝支付是常见的需求。这个压缩包“ios-原生二维码扫描支付宝效果.zip”很可能是提供了一个示例项目,用于展示如何在iOS应用中实现类似支付宝的二维码扫描体验。下面...

    Swift-二维码的生成和使用包括去相册识别照片中的二维码和扫描二维码等

    在Swift编程语言中,二维码(Quick Response code)的生成与使用是移动应用开发中的常见功能。这涉及到图像处理和扫码技术,特别是在iOS应用开发中,Apple提供了强大的框架使得这一过程变得简单高效。以下是对这个...

    Swift-二维码扫描基于系统提供的方法

    现在越来越多的App添加了一个扫码的功能,方便而且很实用,但是目前对弈iOS来说有些比较知名的库(比如ZXingObjC)库都比较大,而实际上,在iOS 7.0之后系统在AVFoundation框架中就已经实现了对于二维码扫描和生成的...

    swift-ios原生的二维码和条形码扫描.zip

    这个压缩包“swift-ios原生的二维码和条形码扫描.zip”显然包含了一组教程或代码示例,专注于使用Swift来实现iOS设备上的二维码和条形码扫描功能。在iOS中,这种功能通常用于数据交换、产品跟踪或者作为用户身份验证...

    IOS应用源码之swift编写的二维码扫描demo.zip

    本示例源码“IOS应用源码之swift编写的二维码扫描demo”提供了一个基于Swift实现的二维码扫描功能的实例,对于学习如何在iOS应用中集成二维码扫描功能的开发者来说,这是一个非常有价值的资源。 首先,我们要了解...

    swift写的二维码扫描Demo

    【Swift编写的二维码扫描Demo详解】 Swift是一种由Apple公司推出并用于开发iOS、macOS、watchOS和tvOS应用程序的编程语言。它以其简洁、安全和高性能的特点深受开发者喜爱。在移动应用开发中,二维码扫描是一项常用...

    Go-QRCode二维码创建扫描

    在这个主题中,我们将深入探讨如何使用Swift进行二维码的创建与扫描。 首先,我们关注的是"Go-QRCode",这是一个Go语言编写的二维码生成库。虽然标题中提到了Go-QRCode,但考虑到标签是"Swift开发-二维码处理",...

    Swift:二维码扫描和生成

    func generateQRCode(from string: String) -> UIImage? { let filter = CIFilter(name: "CIQRCodeGenerator") filter?.setValue(string, forKey: kCIInputMessageKey) guard let outputImage = filter?....

    ios-swift--定位、二维码识别扫描、键盘高度等.zip

    这个压缩包“ios-swift--定位、二维码识别扫描、键盘高度等.zip”显然包含了几个关键的iOS系统功能的实现,包括位置服务、二维码扫描、键盘管理以及可能的音频播放、语音识别和模糊搜索功能。以下是对这些知识点的...

    Swift-用于生成二维码制作和扫描

    在本项目中,"Swift-用于生成二维码制作和扫描" 提供了使用Swift进行二维码处理的功能,包括生成二维码和扫描二维码。这涉及到移动应用开发中的一个重要领域,即条形码和二维码技术。 首先,我们要理解二维码...

    Swift开发-XBQRCodeHandler支持扫描区域的二维码扫描

    总之,XBQRCodeHandler是一个强大的Swift二维码扫描库,它的自定义扫描区域功能使得二维码扫描更加灵活和高效。无论你是正在构建一款新的应用,还是希望改进现有应用的二维码扫描体验,XBQRCodeHandler都是一个值得...

    Swift-一个基于iOS系统API的二维码扫描小框架

    在给定的标题“Swift-一个基于iOS系统API的二维码扫描小框架”中,我们可以理解这是一个使用Swift语言实现的轻量级二维码扫描库,它依赖于iOS系统的API来实现其功能。在iOS中,二维码扫描功能主要由CoreImage和...

    swift-IQEngUICamera自定义相机二维码扫描人脸追踪

    在Swift开发中,创建自定义相机并集成二维码扫描与人脸识别功能是常见的需求,尤其是在构建具有交互性和实用性的移动应用时。IQEngUICamera库提供了一个解决方案,它封装了这些功能,让开发者能够轻松地在iOS应用中...

    基于swift语言实现二维码条形码扫描,本地相册二维码识别

    【作品名称】:基于swift语言实现二维码条形码扫描,本地相册二维码识别 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】...

    ios-苹果原生二维码扫描 3行代码.zip

    在iOS开发中,苹果提供了原生的二维码扫描功能,使得开发者可以轻松地集成这一功能到自己的应用中。本文将详细讲解如何使用仅三行代码实现iOS的二维码扫描,适用于iOS 7.0及以上版本。我们将主要关注苹果的...

    swift-SWQRCodeswift版本高仿微信扫一扫功能

    在iOS应用开发中,"swift-SWQRCodeswift版本高仿微信扫一扫功能"是一个典型的案例,展示了如何使用Swift编程语言实现类似微信的二维码扫描功能。这个项目名为"SWQRCode_Swift-master",它是一个开源的库,旨在帮助...

    swift-SSJImage-Scan图片压缩和二维码生成or扫描二维码

    SSJImage-Scan也包含了二维码扫描功能,这通常涉及到摄像头的使用和图像识别。在iOS中,我们可以利用AVFoundation框架的`AVCaptureMetadataOutput`类来捕获和识别二维码。当扫描到二维码时,会触发代理方法,返回...

Global site tag (gtag.js) - Google Analytics