`

swift -> 二维码扫描

阅读更多

 

 

import UIKit
import AVFoundation

class ScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate,
UIAlertViewDelegate{
    
    var scanRectView:UIView!
    var device:AVCaptureDevice!
    var input:AVCaptureDeviceInput!
    var output:AVCaptureMetadataOutput!
    var session:AVCaptureSession!
    var preview:AVCaptureVideoPreviewLayer!
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        fromCamera();
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //通过摄像头扫描
    func fromCamera() {
        do{
            self.device = AVCaptureDevice.default(for: AVMediaType.video)
            
            self.input = try AVCaptureDeviceInput(device: device)
            
            self.output = AVCaptureMetadataOutput()
            output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
            
            self.session = AVCaptureSession()
            if UIScreen.main.bounds.size.height<500 {
                self.session.sessionPreset = AVCaptureSession.Preset.vga640x480
            }else{
                self.session.sessionPreset = AVCaptureSession.Preset.high
            }
            
            self.session.addInput(self.input)
            self.session.addOutput(self.output)
            
            self.output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
            
            //计算中间可探测区域
            let windowSize = UIScreen.main.bounds.size
            let scanSize = CGSize(width:windowSize.width*3/4, height:windowSize.width*3/4)
            var scanRect = CGRect(x:(windowSize.width-scanSize.width)/2,
                                  y:(windowSize.height-scanSize.height)/2,
                                  width:scanSize.width, height:scanSize.height)
            //计算rectOfInterest 注意x,y交换位置
            scanRect = CGRect(x:scanRect.origin.y/windowSize.height,
                              y:scanRect.origin.x/windowSize.width,
                              width:scanRect.size.height/windowSize.height,
                              height:scanRect.size.width/windowSize.width);
            //设置可探测区域
            self.output.rectOfInterest = scanRect
            
            self.preview = AVCaptureVideoPreviewLayer(session:self.session)
            self.preview.videoGravity = AVLayerVideoGravity.resizeAspectFill
            self.preview.frame = UIScreen.main.bounds
            self.view.layer.insertSublayer(self.preview, at:0)
            
            //添加中间的探测区域绿框
            self.scanRectView = UIView();
            self.view.addSubview(self.scanRectView)
            self.scanRectView.frame = CGRect(x:0, y:0, width:scanSize.width,
                                             height:scanSize.height);
            self.scanRectView.center = CGPoint( x:UIScreen.main.bounds.midX,
                                                y:UIScreen.main.bounds.midY)
            self.scanRectView.layer.borderColor = UIColor.green.cgColor
            self.scanRectView.layer.borderWidth = 1;
            
            //开始捕获
            self.session.startRunning()
        }catch _ {
            //打印错误消息
            let alertController = UIAlertController(title: "提醒",
                                                    message: "请在iPhone的\"设置-隐私-相机\"选项中,允许本程序访问您的相机",
                                                    preferredStyle: .alert)
            let cancelAction = UIAlertAction(title: "确定", style: .cancel, handler: nil)
            alertController.addAction(cancelAction)
            self.present(alertController, animated: true, completion: nil)
        }
    }
    
    //摄像头捕获
    func metadataOutput(_ output: AVCaptureMetadataOutput,
                        didOutput metadataObjects: [AVMetadataObject],
                        from connection: AVCaptureConnection) {
        var stringValue:String?
        if metadataObjects.count > 0 {
            let metadataObject = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
            stringValue = metadataObject.stringValue
            
            if stringValue != nil{
                self.session.stopRunning()
            }
        }
        self.session.stopRunning()
        //输出结果
        let alertController = UIAlertController(title: "二维码",
                                                message: stringValue,preferredStyle: .alert)
        let okAction = UIAlertAction(title: "确定", style: .default, handler: {
            action in
            //继续扫描
            self.session.startRunning()
        })
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

 

 

 

分享到:
评论

相关推荐

    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) -&gt; 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