参考: 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 看附件
相关推荐
总之,"swift-iOS二维码条形码"项目旨在利用Swift和AVFoundation框架,为iOS应用提供便捷的条码和二维码扫描功能,并且能够处理本地相册中的条码图片。通过封装这些功能,开发者可以轻松集成到自己的应用中,提高...
在iOS应用开发中,Swift语言提供了强大的功能来处理二维码扫描和识别。本教程将深入讲解如何使用Swift原生API实现二维码扫描与识别,同时提供扫描动画和夜间模式(手电筒功能),使得用户体验更加友好。 首先,我们...
本项目"Go-RHScan-实现二维码扫描功能含各种UI手势放大缩小镜头仿微信扫码放大"是针对这一需求而设计的,它采用Swift语言编写,特别关注用户体验和界面交互。以下是该项目的主要知识点: 1. **二维码扫描框架**: ...
在iOS开发中,实现原生的二维码扫描功能并集成支付宝支付是常见的需求。这个压缩包“ios-原生二维码扫描支付宝效果.zip”很可能是提供了一个示例项目,用于展示如何在iOS应用中实现类似支付宝的二维码扫描体验。下面...
在Swift编程语言中,二维码(Quick Response code)的生成与使用是移动应用开发中的常见功能。这涉及到图像处理和扫码技术,特别是在iOS应用开发中,Apple提供了强大的框架使得这一过程变得简单高效。以下是对这个...
现在越来越多的App添加了一个扫码的功能,方便而且很实用,但是目前对弈iOS来说有些比较知名的库(比如ZXingObjC)库都比较大,而实际上,在iOS 7.0之后系统在AVFoundation框架中就已经实现了对于二维码扫描和生成的...
这个压缩包“swift-ios原生的二维码和条形码扫描.zip”显然包含了一组教程或代码示例,专注于使用Swift来实现iOS设备上的二维码和条形码扫描功能。在iOS中,这种功能通常用于数据交换、产品跟踪或者作为用户身份验证...
本示例源码“IOS应用源码之swift编写的二维码扫描demo”提供了一个基于Swift实现的二维码扫描功能的实例,对于学习如何在iOS应用中集成二维码扫描功能的开发者来说,这是一个非常有价值的资源。 首先,我们要了解...
【Swift编写的二维码扫描Demo详解】 Swift是一种由Apple公司推出并用于开发iOS、macOS、watchOS和tvOS应用程序的编程语言。它以其简洁、安全和高性能的特点深受开发者喜爱。在移动应用开发中,二维码扫描是一项常用...
在这个主题中,我们将深入探讨如何使用Swift进行二维码的创建与扫描。 首先,我们关注的是"Go-QRCode",这是一个Go语言编写的二维码生成库。虽然标题中提到了Go-QRCode,但考虑到标签是"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-用于生成二维码制作和扫描" 提供了使用Swift进行二维码处理的功能,包括生成二维码和扫描二维码。这涉及到移动应用开发中的一个重要领域,即条形码和二维码技术。 首先,我们要理解二维码...
总之,XBQRCodeHandler是一个强大的Swift二维码扫描库,它的自定义扫描区域功能使得二维码扫描更加灵活和高效。无论你是正在构建一款新的应用,还是希望改进现有应用的二维码扫描体验,XBQRCodeHandler都是一个值得...
在给定的标题“Swift-一个基于iOS系统API的二维码扫描小框架”中,我们可以理解这是一个使用Swift语言实现的轻量级二维码扫描库,它依赖于iOS系统的API来实现其功能。在iOS中,二维码扫描功能主要由CoreImage和...
在Swift开发中,创建自定义相机并集成二维码扫描与人脸识别功能是常见的需求,尤其是在构建具有交互性和实用性的移动应用时。IQEngUICamera库提供了一个解决方案,它封装了这些功能,让开发者能够轻松地在iOS应用中...
【作品名称】:基于swift语言实现二维码条形码扫描,本地相册二维码识别 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】...
在iOS开发中,苹果提供了原生的二维码扫描功能,使得开发者可以轻松地集成这一功能到自己的应用中。本文将详细讲解如何使用仅三行代码实现iOS的二维码扫描,适用于iOS 7.0及以上版本。我们将主要关注苹果的...
在iOS应用开发中,"swift-SWQRCodeswift版本高仿微信扫一扫功能"是一个典型的案例,展示了如何使用Swift编程语言实现类似微信的二维码扫描功能。这个项目名为"SWQRCode_Swift-master",它是一个开源的库,旨在帮助...
SSJImage-Scan也包含了二维码扫描功能,这通常涉及到摄像头的使用和图像识别。在iOS中,我们可以利用AVFoundation框架的`AVCaptureMetadataOutput`类来捕获和识别二维码。当扫描到二维码时,会触发代理方法,返回...