项目里用到了扫描,出现了bug:感觉就是把二维码正好框在扫描框里扫不出来,然后把镜头离二维码拉远,扫描速度很慢,但是能扫描出来。网上找了下代码,发现也没啥哪里不一样,感觉很坑啊,后面发现不设置

AVCaptureMetadataOutput 的 rectOfInterest ,只要镜头遇到二维码,就出来扫描结果了。

看官方文档:

/*!

@property rectOfInterest

@abstract

Specifies a rectangle of interest for limiting the search area for visual metadata.

@discussion

The value of this property is a CGRect that determines the receiver's rectangle of interest for each frame of video. The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata. Specifying a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.

*/

@property(nonatomic) CGRect rectOfInterest NS_AVAILABLE_IOS(7_0);

@ property rectOfInterest
@ abstract
指定一个矩形,用于限制可视元数据的搜索区域。
@discussion
这个属性的值是一个CGRect,每一帧视频的接收都跟这个矩形区域有关。矩形的原点在左上角,相对于提供元数据的设备的坐标空间。指定rectOfInterest可以提高特定类型元数据的检测性能。此属性的默认值是CGRectMake(0,0,1,1),其边界不与rectOfInterest相交的元数据对象将不会返回。

但是这么设置之后发现不是那么回事。找了下资料:

AVCaptureMetadataOutput 中的属性rectOfInterest 看起来是CGRect类型, 结果让你填写一个比例, 当你填写比例是你会发现还是有各种问题,  最后总结一下, 加入你的屏幕的frame 为  x , y,  w, h,  你要设置的矩形快的frame  为  x1, y1, w1, h1.   那么你的 rectOfInterest 应该设置为  CGRectMake(y1/y, x1/x, h1/h, w1/w)

举例子:

我们的扫描区域案图左边的原点来说是,CGRectMake((kScreenWidth-200)/2,(kScreenHeight-200)/2,200,200);

那我们设置的时候呢:

outPut.rectOfInterest = CGRectMake(((kScreenHeight-200)/2)/kScreenHeight,  ((kScreenWidth-200)/2)/kScreenWidth,  200/kScreenHeight,  200/kScreenWidth);

就是原坐标点从左边的这样变成右边的这样了。而且还要转换成比例。

另外还有种方法,就是调系统的转换方法,但是这个方法要在[_session startRunning] 之后才管用,代码如下:

CGRect intertRect = [_preview metadataOutputRectOfInterestForRect:CGRectMake((kScreenWidth-200)/2, (kScreenHeight-200)/2, 200, 200)];

[_output setRectOfInterest:intertRect];

我打印了下这个rect,输出的值差不多。差值基本可以忽略。

   //第一种方法,直接设置:

    CGRect test = CGRectMake(((kScreenHeight-200)/2)/kScreenHeight,((kScreenWidth-200)/2)/kScreenWidth,200/kScreenHeight,200/kScreenWidth);
NSLog(@"test:%@",NSStringFromCGRect(test)); //第二种方法,调系统方法设置,但是要在startRunning后才有效果: // Start
[_session startRunning]; CGRect intertRect = [_preview metadataOutputRectOfInterestForRect:CGRectMake((kScreenWidth-200)/2, (kScreenHeight-200)/2, 200, 200)];
[_output setRectOfInterest:intertRect];
NSLog(@"intertRect:%@",NSStringFromCGRect(intertRect)); //打印结果: test:{{0.3641304347826087, 0.25845410628019322}, {0.27173913043478259, 0.48309178743961351}} intertRect:{{0.36413043478260865, 0.25845410628019327}, {0.27173913043478259, 0.48309178743961356}}

bug: 使用 iOS 系统方法进行二维码扫描,扫描区域的问题的更多相关文章

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

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

  2. IOS原声二维码条形码扫描实现

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

  3. iOS开发——生成二维码——工具类

    啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...

  4. iOS学习——iOS原生实现二维码扫描

    最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...

  5. iOS 自带二维码扫描功能的实现

    自从iOS7以后中新增了二维码扫描功能.因此可以在不借助第三方类库的情况下简单的写出二维码的扫描功能: 原生的二维码扫描功能在AVFoundation框架下,所以在使用原生的二维码扫描功能时要先导入A ...

  6. iOS开发-二维码

    二维码 从ios7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤: 倒入CoreImage框架 通过滤镜CIFilter生成二维码 二维码的内 ...

  7. ios中二维码的使用之二: 二维码的扫描

    二维码的扫描: 1,导入支持框架,<AVFoundation/AVFoundation.h> 2 ,扫描:

  8. iOS学习之二维码扫描

    这几天刚好将本人高仿新浪微博的事情进行一个阶段性的tag,在此也将这个项目在实现二维码扫描这个功能来做一个简要的记录.关于高仿新浪微博的源代码,本人已经将全部代码托管到github,地址在这里.欢迎大 ...

  9. iOS笔记061 - 二维码的生成和扫描

    二维码 生成二维码 二维码可以存放纯文本.名片或者URL 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 1.创建过滤器 2.恢复滤镜的默认属性 3.设置内容 4. ...

随机推荐

  1. Java知多少(11)数据类型转换

    数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转换顺序不受限制. 自 ...

  2. Java知多少(24)包装类、拆箱和装箱详解

    虽然 Java 语言是典型的面向对象编程语言,但其中的八种基本数据类型并不支持面向对象编程,基本类型的数据不具备“对象”的特性——不携带属性.没有方法可调用. 沿用它们只是为了迎合人类根深蒂固的习惯, ...

  3. token令牌和jwt

    用户登录,后端生成token返回给前端 前端拿到token,以后每次登录使用header里的token进行权限验证 后端接收到前端传来的token,如果是通过数据库或redis或session进行比对 ...

  4. AutoIt 软件自动化操作

    AutoIt 目前最新是v3版本,这是一个使用类似BASIC脚本语言的免费软件,它设计用于Windows GUI(图形用户界面)中进行自动化操作. 它利用模拟键盘按键,鼠标移动和窗口/控件的组合来实现 ...

  5. jQuery移除或禁用html元素点击事件常用方法小结

    移除或禁用html元素的点击事件可以通过css实现也可以通过js或jQuery实现. 一.CSS方法 .disabled { pointer-events: none; } 二.jQuery方法 方法 ...

  6. centos7 防火墙

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  7. 51 IP核查询

    康芯的IP核 Oregano systems 公司的MC8051 IP CoreSynthesizeable VHDL Microcontroller IP-Core User Guide这个里面51 ...

  8. 4G通信模块在ARM平台下的应用

    4G模块是连接物与物的重要载体,是终端设备接入物联网的核心部件之一.随着4G的普及,许多新兴市场对4G通信模块的需求都在日益扩大,那么在ARM平台的嵌入式设备上如何快速的应用4G模块呢? 4G通信模块 ...

  9. SyntheticEvent

    在react 的事件中使用SyntheticEvent 就会出现下面的报错 <input onChange={async e => { await foo() ... }} /> 那 ...

  10. TSPL学习笔记(2):过程和变量绑定

    变量的引用 语法: variable 返回: variable的值 如果在某个范围内存在对某个标识符的变量绑定,那么当这个标识符以表达式的形式出现的时候被认为是其所绑定变量的值. 在引用一个标识符的时 ...