iOS系统原生二维码条形码扫描

 本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW。细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了。这个代码自己写就行了,与本文关系不大。。。绿色的线会上下跑,不要担心:D

实现效果如下:

  1.在工程中添加框架AVFoundation.framework

  2.声明代理:AVCaptureMetadataOutputObjectsDelegate 。 define 几个东东用来画框、画线:

#define SCANVIEW_EdgeTop 40.0
#define SCANVIEW_EdgeLeft 50.0
#define TINTCOLOR_ALPHA 0.2 //浅色透明度
#define DARKCOLOR_ALPHA 0.5 //深色透明度
#define VIEW_WIDTH [UIScreen mainScreen].bounds.size.width
#define VIEW_HEIGHT [UIScreen mainScreen].bounds.size.height

 

  3.声明以下属性:

    AVCaptureSession * session;//输入输出的中间桥梁
    UIView *AVCapView;//此 view 用来放置扫描框、取消按钮、说明 label
    UIView *_QrCodeline;//上下移动绿色的线条
    NSTimer *_timer;

  4.在某个方法中(我是点击扫描按钮)创建扫描界面,开始扫描:

 //创建一个 view 来放置扫描区域、说明 label、取消按钮
    UIView *tempView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, [UIScreen mainScreen].bounds.size.height )];
    AVCapView = tempView;
    AVCapView.backgroundColor = [UIColor colorWithRed:54.f/255 green:53.f/255 blue:58.f/255 alpha:1];
    
    UIButton *cancelBtn = [[UIButton alloc]initWithFrame:CGRectMake(15, [UIScreen mainScreen].bounds.size.height - 100, 50, 25)];
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(15, 268, 290, 60)];
    label.numberOfLines = 0;
    label.text = @"小提示:将条形码或二维码对准上方区域中心即可";
    label.textColor = [UIColor grayColor];
    [cancelBtn setTitle:@"取消" forState: UIControlStateNormal];
    [cancelBtn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
    [cancelBtn addTarget:self action:@selector(touchAVCancelBtn) forControlEvents:UIControlEventTouchUpInside];
    [AVCapView addSubview:label];
    [AVCapView addSubview:cancelBtn];
    [self.view addSubview:AVCapView];
    
    
    //画上边框
    UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop, VIEW_WIDTH- 2 * SCANVIEW_EdgeLeft, 1)];
    topView.backgroundColor = [UIColor whiteColor];
    [AVCapView addSubview:topView];
    
    //画左边框
    UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop , 1,VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft )];
    leftView.backgroundColor = [UIColor whiteColor];
    [AVCapView addSubview:leftView];
    
    //画右边框
    UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft + VIEW_WIDTH- 2 * SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop , 1,VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft + 1)];
    rightView.backgroundColor = [UIColor whiteColor];
    [AVCapView addSubview:rightView];
    
    //画下边框
    UIView *downView = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop + VIEW_WIDTH- 2 * SCANVIEW_EdgeLeft,VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft ,1 )];
    downView.backgroundColor = [UIColor whiteColor];
    [AVCapView addSubview:downView];

    
    //画中间的基准线
    _QrCodeline = [[UIView alloc] initWithFrame:CGRectMake(SCANVIEW_EdgeLeft + 1, SCANVIEW_EdgeTop, VIEW_WIDTH- 2 * SCANVIEW_EdgeLeft - 1, 2)];
    _QrCodeline.backgroundColor = [UIColor greenColor];
    [AVCapView addSubview:_QrCodeline];
    
    
    // 先让基准线运动一次,避免定时器的时差
    [UIView animateWithDuration:1.2 animations:^{
        
        _QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + 1, VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop , VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft - 1, 2);
        
    }];

    [self performSelector:@selector(createTimer) withObject:nil afterDelay:0.4];

    
    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //创建输入流
    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    //创建输出流
    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
    //设置代理 在主线程里刷新
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    //初始化链接对象
    session = [[AVCaptureSession alloc]init];
    //高质量采集率
    [session setSessionPreset:AVCaptureSessionPresetHigh];
    
    [session addInput:input];
    [session addOutput:output];
    //设置扫码支持的编码格式(如下设置条形码和二维码兼容)
    output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
    
    AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:session];
    layer.videoGravity=AVLayerVideoGravityResizeAspectFill;
    layer.frame = CGRectMake(SCANVIEW_EdgeLeft, SCANVIEW_EdgeTop, VIEW_WIDTH- 2 * SCANVIEW_EdgeLeft, 220);
    [AVCapView.layer insertSublayer:layer atIndex:0];
    //开始捕获
    [session startRunning];

  5.实现定时器、还有基准线的滚动方法

- (void)createTimer
{
    _timer=[NSTimer scheduledTimerWithTimeInterval:1.1 target:self selector:@selector(moveUpAndDownLine) userInfo:nil repeats:YES];
}

- (void)stopTimer
{
    if ([_timer isValid] == YES) {
        [_timer invalidate];
        _timer = nil;
    }
    
}

// 滚来滚去 :D :D :D
- (void)moveUpAndDownLine
{
    CGFloat YY = _QrCodeline.frame.origin.y;
    
    if (YY != VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop ) {
        [UIView animateWithDuration:1.2 animations:^{
            _QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + 1, VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft + SCANVIEW_EdgeTop , VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft - 1,2);
        }];
    }else {
        [UIView animateWithDuration:1.2 animations:^{
            _QrCodeline.frame = CGRectMake(SCANVIEW_EdgeLeft + 1, SCANVIEW_EdgeTop, VIEW_WIDTH - 2 * SCANVIEW_EdgeLeft - 1,2);
        }];

    }
}

6.扫描成功后,想干嘛干嘛,就在这个代理方法里面实现就行了

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    if (metadataObjects.count>0) {
        //[session stopRunning];
        AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ];
        //输出扫描字符串
        NSLog(@"%@",metadataObject.stringValue);
        [session stopRunning];
        [self stopTimer];
        [AVCapView removeFromSuperview];
        .....    
    }
}

 

7.如果用户不想扫描了,点击取消按钮:

- (void)touchAVCancelBtn{
    [session stopRunning];//摄像也要停止
    [self stopTimer];//定时器要停止
    [AVCapView removeFromSuperview];//刚刚创建的 view 要移除
    
   ...        
}

 

转载于:https://www.cnblogs.com/onlyMyRailGun/p/5320041.html

使用AVFoundation实现iOS原生二维码、条形码扫描(可限制扫描范围、可手动调节焦距) 第一次写博客,没有经验,有不正确或不规范的地方,希望大家不吝赐教。多谢支持! 最近需要做一个二维码扫描功能,在网上找了很多资料,有两个比较有名气的第三方框架:ZXing 和 ZBar。这两个框架都算比较成熟的了,使用度也很广,现在也都支持64位了。但我个人有点强迫症的,就是尽量不选择使用第三方框架,以免失去主动权(个人喜好),于是找到了AVFoundation,iOS7及以后的系统都可以支持, 阅读详情

相关推荐

iOS--AVFoundation原生二维码与一维码扫描

18th,March,2016 (题外话: 其实现在是拒绝写博客的,因为不想写,但是还是写吧) 概述 实现二维码和条形码扫描,两大开源组件ZBar与ZXing ZBar: 扫描灵敏性,内存较优,但“圆角二维码”扫描比较困难。 ZXing: Google Code上的一个开源的条形码扫描库,是用java设计 而苹果原生的AVFoundation扫描灵敏性和

Jolie_Yang的博客 3692

qr_code_scanner在release模式下白屏

用了qr_code_scanner插件,debug模式正常。结果release打包之后再用扫码白屏。 首先到它的官网找到最新版本0.6.1,升级之后发现并没有解决问题。 后来到github上issues中看看有没有同款问题,还真让我找到了~~ 链接在此 就是在扫码页面中, //用Stack会白屏 Stack(children: [ QRView ]) //Stack换成Column正常 Column(children: [ QRView //Ok ]) 这样在release模

ffddffddfd的专栏 698

iOS二维码生成与扫描(zbar和原生AVFoundation)

公司iOS项目需要用到二维码扫描,本来已经有人写好了,但是扫描速度不太快,于是让我接手研究一下。之前也没接触过二维码扫描,写这篇博客献给新手。 先来二维码生成吧,二维码生成需要libqrencode库,将libqrencode库下载下来拖入工程(文章末会提供下载链接),在QRCodeGenerator.h中#import ,否则会报错。 使用举例:UIImage *image =[QRC

qq_24307675的专栏 2715

ios 二维码扫描(微信二维码扫描音效)

非常感谢大家利用自己宝贵的时间来阅读我的文章 ,  今天给大家带来的是一个原生二维码扫描的demo,很久之前写的代码,最近项目要用,想着以后用到的可能性也挺大的,就翻出来整理了个demo出来,如果需要的可以做个参考。如果需要的话希望能帮到你 , 当然, 有任何不妥的地方 欢迎指正。喜欢的可以关注一下我的博客、我的简书 老规矩,先上效果展示 卧槽,这个gif为何如此之大。。。

xiaozhaoqiang的博客 4086

iOS扫码识别之后添加震动/播放声音提示、歌词解析并随音乐滚动显示(包含demo源码)

使用方法 [QCTMsgPlaySound ScanMsgPlaySound]; .h #import <Foundation/Foundation.h> #import <AudioToolbox/AudioToolbox.h> NS_ASSUME_NONNULL_BEGIN @interface QCTMsgPlaySound : NSObject { ...

专注于计算机研发知识和资讯分享 2万+

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。

weixin_42685438的博客 379

(一百六十七)Android P WiFi扫描成功结果上报

1.引子 接之前(一百五十五)Android P wifi 扫描失败结果上报流程梳理-扫描上报梳理的疑问 看这块代码有点失望,扫描失败只是framework的上报,比如参数不对,当前处于idle模式或者没有在timeout 4s内执行扫描,都停留在framework层,扫描命令执行结果失败的上报貌似并没有。 遗留问题:那何时会触发onResults呢? 扫描命令执行失败的上报还是有的,...

JT的专栏 3208

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

iOS 关于系统原生的条形码扫描和二维码的使用

//-------------------------------QrCodeViewController.h #import "BaseViewController.h" #import typedef void(^qrCode)(NSString *); @interface QrCodeViewController : BaseViewController {   

优快云_qingfengHH的博客 531

MIT Mini Cheetah--仿真流程

MIT Mini Cheetah–仿真 摘要 由于官方提供代码中,控制仿真环境中的猎豹机器人运动需要遥控器来控制。官方默认推荐使用logitech Gamepad F310游戏手柄:We use the Logitech F310 controller. There’s a switch in the back, which should be in the “X” position. The controller needs to reconnected if you change the switch

Galaxy_Robot的博客 5916

Bochs源码分析 - 26:8259中断控制器介绍

前言 现在我们跟着《x86/x64体系探索及编程》来分析17章内容 -- 8259中断控制器。这个是涉及硬件的,很遗憾,除了大学期间使用STM32搞过一个计算器,其余就没多少硬件编程经验,我在淘宝上找了下大概是这个东东。 https://pdos.csail.mit.edu/6.828/2010/readings/hardware/8259A.pdf 上面是8259A的芯片手册,里面讲的还是挺详细的,虽然里面很多东西还是看不太懂,但是结合着《x86/...

WriteAnything_的博客 967

iOS 之原生扫描二维码

效果图: 源码地址

岁月静好,善待时光。 556

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1308

系统扫二维码

写到二维码扫描,随手记下,纯属个人观点,如有错误,请指教。

wsqfly博客 327

YOLOv11改进,YOLOv11引入B2CNet的BFAM(双时相特征聚合模块),JSTARS 2024,二次创新C3k2结构

YOLOv11改进,YOLOv11引入B2CNet的BFAM(双时相特征聚合模块),JSTARS 2024,二次创新C3k2结构

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 406

从 SEGW 到 SADL 的那根线,彻底理解 OData Data Source Mapping

本文摘要(150字): 在SAP Gateway的SADL型OData服务开发中,"Map to Data Source"是关键配置环节。与传统RFC映射不同,SADL映射不是针对单个CRUDQ操作,而是建立OData模型与SADL业务实体间的完整语义对应关系。通过属性映射和关联映射,系统能自动处理数据获取和导航请求。映射编辑器支持三种模式:属性映射处理字段对应,关联映射处理模型间关系,动作映射处理业务操作。映射的本质是建立语义翻译表,决定了后续OData请求如何转化为后端业务实体访问,而非简单的字段重命名

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 61

使用IOS7原生API进行二维码条形码的扫描

使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库。常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口。经过测试,使用原生API扫描和处理的效率非常高,远远高于第三方库。 一、使用方法示例 官方提供的接口非常简单,代码如下: 1 2 3 4 5 6...

weixin_30457551的博客 70

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

探索iOS二维码与条形码扫描的全新境界:swiftScan

**安装方式**: - **CocoaPods**: ```ruby platform :ios, '8.0' use_frameworks! pod 'swiftScan', :git => 'https://github.com/MxABC/swiftScan.git' ``` - **手动安装**:下载项目并复制 `Source` 文件夹到你的项目中。 --- *

gitblog_00814的博客 883

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS二维码生成与识别

在 IOS7 以前,在IOS中实现二维码和条形码扫描,有两大开源组件ZBar与ZXing. 总结下各自的缺点: ZBar在扫描的灵敏度上,和内存的使用上相对于ZXing上都是较优的,但是对于 “圆角二维码” 的扫描确很困难。 ZXing 是 Google Code上的一个开源的条形码扫描库,是用java设计的,连Google Glass 都在使用的。但有人为了追求更高效率以及...

weixin_30877181的博客 148

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IOS 仿微信二维码/条形码扫描js与WKwebview交互调取二维码扫描

h5 js调用ios方法,请参考之前的文档 //JS调用OC 添加处理脚本 //ScriptMessageHandler [userContentController addScriptMessageHandler:self name:@"CallScanCodeHandler"]; #pragma mark - WKScriptMessageHandler - (void)userContentController:(WKUserContentController *)use...

秋天的博客 962

IOS下使用AVFoundation实现条形码和二维码扫描

IOS下使用AVFoundation实现条形码和二维码扫描

u012399891的博客 9511
上一篇: 给键盘添加一个工具条
下一篇: Port 8081 already in use, packager is either not running or not running correctly
YZP664521
博客等级 码龄11年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值