iOS实现一个简单的扫码功能

用到的是AVFoundation

需要用到Capture,Input,Output,Session,previewLayer相关类

#import "ScanQRCodeController.h"
#import <AVFoundation/AVFoundation.h>
#define WIDTH [UIScreen mainScreen].bounds.size.width
#define HEIGHT [UIScreen mainScreen].bounds.size.height
@interface ScanQRCodeController ()<AVCaptureMetadataOutputObjectsDelegate>
@property (nonatomic,strong)AVCaptureSession  *session;
@property (nonatomic,strong)AVCaptureVideoPreviewLayer *previewLayer;
@end

@implementation ScanQRCodeController

- (void)viewDidLoad {
    [super viewDidLoad];

    _session = [[AVCaptureSession alloc]init];

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    NSError *error = nil;
    AVCaptureDeviceInput *input = [[AVCaptureDeviceInput alloc]initWithDevice:device error:&error];
    if (error) {
        NSLog(@"初始化input失败,%@",error);
        return;
    }
    if ([_session canAddInput:input]) {
        [_session addInput:input];
        NSLog(@"添加input成功");
    }else{
        NSLog(@"添加input失败");
        return;
    }
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init];
    if ([_session canAddOutput:output]) {
        [_session addOutput:output];
        NSLog(@"添加output成功");
    }else{
        NSLog(@"添加output失败");
        return;
    }

    [output setMetadataObjectTypes:[NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,nil]];

    dispatch_queue_t dispatchQueue = dispatch_queue_create("myQueue", NULL);

    [output setMetadataObjectsDelegate:self queue:dispatchQueue];

    _previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
    [_previewLayer setFrame:self.view.layer.bounds];
    [_previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    [self.view.layer insertSublayer:_previewLayer atIndex:0];
    //10.设置扫描范围
//    output.rectOfInterest = CGRectMake(0.2f, 0.2f, 0.6f, 0.6f);
    //10.开始扫描
    [_session startRunning];
    NSLog(@"开始扫描");
}

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    NSLog(@"come:%@",metadataObjects);
}

@end

注意:

1.输出类型错误的话,没有输出

扫描条形码

    [output setMetadataObjectTypes:[NSArray arrayWithObjects:AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code,nil]];

扫描二维码

    [output setMetadataObjectTypes:[NSArray arrayWithObjects:AVMetadataObjectTypeQRCode,nil]];

2.设置output的类型必须在执行addOutput方法之后,否则会崩溃

原文地址:https://www.cnblogs.com/yufang/p/11764072.html

时间: 2024-11-09 09:26:10

iOS实现一个简单的扫码功能的相关文章

微信扫一扫的扫码功能是本地实现还是联网实现的?

微信扫一扫的扫码功能很弱,速度慢,经常有二维码识别不了.Dynamsoft的同事怀疑微信的扫码不是在本地完成的,而是把数据传输到了server端来解码.如何才能得到答案? 微信扫一扫网速检测 为什么会有人怀疑微信的扫码是需要连接server的,原因在于在断网的情况下,微信扫描是不可用的.那么在联网的情况下怎么可以知道数据传输了没有?我在手机上打开状态栏网速显示. 数值很小,不可能有图像数据传输.扫码应该是本地完成的.再进一步验证下. 窥探微信安装包 手机应用的安装包其实就是一个压缩包,用7zip

完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能

#!/bin/usr/env python#coding=utf-8'''完成一段简单的Python程序,用于实现一个简单的加减乘除计算器功能'''try: a=int(raw_input("please input a number:"))except ValueError: print("第一个运算数字输入非数字") try: b=int(raw_input("please input another number:"))except Val

如何实现扫码功能?

之前讲过前端生成二维码,那H5 APP如何实现扫码功能; 扫码功能的实现 (一).使用H5 API barcode实现扫码功能 # 模板 <template> <div> <div class="scan"> <div id="bcid"></div> <footer> <button v-if="Start" @click="startRecognize&q

iOS 制作一个简单的画板

制作简单画板 作为iOS初学者,在学习完UI的几个简单控件(UILable,UITextField,UIButton)之后,就可以制作一个简单的画图板demo,以下是具体制作流程(在MRC下),如有不足之处,还请各位大神们指教 0.0. 1.搭建界面,主要由UIButton,UITextField组成,底部的按钮是UITextField的一个自定义键盘(inputView) . - (void)viewDidLoad { [super viewDidLoad]; //创建菜单按钮 UIButto

IOS中一个简单的粒子效果实现

1.效果图展示 2.实现思路 1> 首先要实现上面的效果,第一步要处理的就是一个简单的画板,在View上面用鼠标滑动的时候画出线条,这个功能可使用UIBezierPath实现 2> 关于粒子效果的实现,可以创建一个CALayer,然后用CAReplicatorLayer进行复制layer,从而达到粒子效果 3.代码实现 DrawView类的封装与编写 // // DrawView.m // 06-粒子效果 // // Created by xiaomage on 15/6/24. // Cop

数据结构学习1:实现一个简单的线性表功能

数据结构: 一个简单的线性表的实现 学习了数据结构有一段时间了,那是半年前老师课堂上讲的,最后由于一些原因,没能听到最后,前几天在写一些算法的时候,发现自己的数据结构还是太渣了,因此便又拿起了那本很有价值的数据结构的书,重新来啃这本厚厚的书,数据结构在我们编程中是非常的重要的,希望这次的学习能有一个好的开头,并且能在这个过程中有所得吧! 下面是我写的一个简单的线性表的实现: #include"stdafx.h" #include<iostream> using namesp

IOS做一个简单计算器

//声明非原创 步骤: 1.打开Xcode,单机Creat a new Xcode project 2.左边选择ios下Application,右边选择single view Application 3.填写项目名称单机Next 4.ViewController.h中定义成员和方法 // // ViewController.h // TestCalculator4 // // Created by heyonggang on 13-11-28. // Copyright (c) 2013年 Mi

通过ASP.NET MVC框架 + 原生JavaScript + Ajax + SQL SERVER 实现一个简单的有论坛功能的网站(有通过iis发布的例子)

ASP.NET MVC. M 为Model模型层, V 为View视图层, C 为Controller控制层.要想使用MVC框架来写网站就需要了解M V C 的作用分别为哪些.给大家简单的介绍一下: 1.当你的这个网站要与数据库交互的时候,你可以使用EF创建一个数据库模型,也可以用类存放你所需交互的字段数据.我们往往把这类文件放在model层. 2.view层,存放前端网页的. 3.controller层实现前端网页功能的,在这个层里面我们编写的方法称为action. www.lazyfitne

Android平台,利用zxing库开发扫码功能

Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发. 1.如何将zxing的Android源码导入工程. 在导入zxing的android源码之前,先去官方下载zxing的源码:http://code.google.com/p/zxin