方法一:iOS7以上可以使用系统自带的: AVCaptureSession
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVCaptureInput.h>
#import <AVFoundation/AVCaptureOutput.h>
#import <AVFoundation/AVCaptureSession.h>
要用到以上四个系统库,可以直接导入
#import <AVFoundation/AVFoundation.h>
要实现<AVCaptureMetadataOutputObjectsDelegate>协议
{
AVCaptureSession *session;
// 获取摄像设备
AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
// 创建输入流
AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:deviceerror:nil];
// 创建输出流
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc] init];
// 将rectOfInterest设置为(0.5, 0.5, 0.5, 0.5)的时候只有左下角占屏幕四分之一的大小的地方可以扫描
// 将rectOfInterest设置为(0, 0.5, 0.5, 0.5)的时候只有左上角占屏幕四分之一的大小的地方可以扫描
// 将rectOfInterest设置为(0, 0, 0.5, 0.5)的时候只有右上角占屏幕四分之一的大小的地方可以扫描
// 将rectOfInterest设置为(0.5, 0, 0.5, 0.5)的时候只有右下角占屏幕四分之一的大小的地方可以扫描
// rectOfInterest默认为(0, 0, 1, 1)整个屏幕都可以扫描
output.rectOfInterest = CGRectMake(0.5, 0.5, 0.5, 0.5);
// 设置代理在主线程里刷新
[output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
// 初始化链接对象
session = [[AVCaptureSessionalloc] init];
// 高质量采集率
[sessionsetSessionPreset:AVCaptureSessionPresetHigh];
[session addInput:input];
[session addOutput:output];
// 设置扫码支持的编码格式(如下设置条形码和二维码兼容)
output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];
AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayerlayerWithSession:session];
layer.videoGravity =AVLayerVideoGravityResizeAspectFill;
layer.frame = self.view.layer.bounds;
// [self.view.layer insertSublayer:layer atIndex:0];
[self.view.layeraddSublayer:layer];
// 开始捕获
[sessionstartRunning];
}
#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count) {
// [session stopRunning];
AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjectsfirstObject];
NSLog(@"%@", metadataObject.stringValue);
}
}
方法二: 使用ZBar
导入ZBarSDK,导入依赖的系统库
CoreMedia.framework
CoreVideo.framework
QuartzCore.framework
头文件
#import"ZBarSDK.h"
实现协议
ZBarReaderViewDelegate
{
ZBarReaderView *_readerView;
_readerView = [[ZBarReaderViewalloc] init];
_readerView.frame =CGRectMake(0,64, self.view.frame.size.width,self.view.frame.size.height -64);
_readerView.tracksSymbols =NO;
_readerView.readerDelegate =self;
[self.viewaddSubview:_readerView];
[_readerView start];
}
#pragma mark -- ZBarReaderViewDelegate
- (void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage*)image
{
constzbar_symbol_t *symbol =zbar_symbol_set_first_symbol(symbols.zbarSymbolSet);
NSString *result = [NSStringstringWithUTF8String:zbar_symbol_get_data(symbol)];
NSLog(@"%@", result);
}