ios原生二維碼掃描

做iOS的二維碼掃描,有兩個第三方庫可以選擇,ZBar和ZXing。今天要介紹的是iOS7.0后AVFoundation框架提供的原生二維碼掃描敏释。

首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以開始了摸袁。

一钥顽、做好準(zhǔn)備工作,搭建UI

UI效果如圖

IBOutlet靠汁、IBAction如下:

@property(weak, nonatomic) IBOutlet UIView *viewPreview;

@property(weak, nonatomic) IBOutlet UILabel *lblStatus;

@property(weak, nonatomic) IBOutlet UIButton *startBtn;

- (IBAction)startStopReading:(id)sender;

接下來就都是代碼的事情了

二蜂大、控制器ViewController.h

首先導(dǎo)入AVFoundation框架


1#import<AVFoundation/AVFoundation.h>

然后控制器實現(xiàn) AVCaptureMetadataOutputObjectsDelegate協(xié)議

1@interfaceViewController ()<AVCaptureMetadataOutputObjectsDelegate>

整體property如下:

@property(strong, nonatomic) UIView *boxView;

@property(nonatomic) BOOL isReading;

@property(strong, nonatomic) CALayer *scanLayer;

-(BOOL)startReading;

-(void)stopReading;

//捕捉會話

1@property (nonatomic, strong) AVCaptureSession *captureSession;

//展示layer

1@property(nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;

然后在ViewDidLoad方法中初始化

- (void)viewDidLoad {

??[superviewDidLoad];


??_captureSession = nil;

???_isReading = NO;


}

接下來實現(xiàn)startReading方法(這可就是重點咯)

- (BOOL)startReading {

?NSError *error;

?//1.初始化捕捉設(shè)備(AVCaptureDevice),類型為AVMediaTypeVideo

?AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

?//2.用captureDevice創(chuàng)建輸入流

?AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

?if(!input) {

??NSLog(@"%@", [error localizedDescription]);

??returnNO;

?}

?//3.創(chuàng)建媒體數(shù)據(jù)輸出流

?AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];

?//4.實例化捕捉會話

?_captureSession = [[AVCaptureSession alloc] init];

?//4.1.將輸入流添加到會話

?[_captureSession addInput:input];

?//4.2.將媒體輸出流添加到會話中

?[_captureSession addOutput:captureMetadataOutput];

?//5.創(chuàng)建串行隊列膀曾,并加媒體輸出流添加到隊列當(dāng)中

?dispatch_queue_t dispatchQueue;

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

?//5.1.設(shè)置代理

?[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];

?//5.2.設(shè)置輸出媒體數(shù)據(jù)類型為QRCode

?[captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];

?//6.實例化預(yù)覽圖層

?_videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];

?//7.設(shè)置預(yù)覽圖層填充方式

?[_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

?//8.設(shè)置圖層的frame

?[_videoPreviewLayer setFrame:_viewPreview.layer.bounds];

?//9.將圖層添加到預(yù)覽view的圖層上

?[_viewPreview.layer addSublayer:_videoPreviewLayer];

?//10.設(shè)置掃描范圍

?captureMetadataOutput.rectOfInterest = CGRectMake(0.2f, 0.2f, 0.8f, 0.8f);

?//10.1.掃描框

?_boxView = [[UIView alloc] initWithFrame:CGRectMake(_viewPreview.bounds.size.width * 0.2f, _viewPreview.bounds.size.height * 0.2f, _viewPreview.bounds.size.width - _viewPreview.bounds.size.width * 0.4f, _viewPreview.bounds.size.height - _viewPreview.bounds.size.height * 0.4f)];

?_boxView.layer.borderColor = [UIColor greenColor].CGColor;

?_boxView.layer.borderWidth = 1.0f;

?[_viewPreview addSubview:_boxView];

?//10.2.掃描線

?_scanLayer = [[CALayer alloc] init];

?_scanLayer.frame = CGRectMake(0, 0, _boxView.bounds.size.width, 1);

?_scanLayer.backgroundColor = [UIColor brownColor].CGColor;

?[_boxView.layer addSublayer:_scanLayer];

?NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(moveScanLayer:) userInfo:nil repeats:YES];

?[timer fire];


?//10.開始掃描

?[_captureSession startRunning];

?returnYES;

}

實現(xiàn)AVCaptureMetadataOutputObjectsDelegate協(xié)議方法

#pragma mark - AVCaptureMetadataOutputObjectsDelegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

?//判斷是否有數(shù)據(jù)

?if(metadataObjects != nil && [metadataObjects count] > 0) {

??AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];

??//判斷回傳的數(shù)據(jù)類型

??if([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {

???[_lblStatus performSelectorOnMainThread:@selector(setText:) withObject:[metadataObj stringValue] waitUntilDone:NO];

???[self performSelectorOnMainThread:@selector(stopReading) withObject:nil waitUntilDone:NO];

???_isReading = NO;

??}

?}

}

實現(xiàn)計時器方法moveScanLayer:(NSTimer *)timer

- (void)moveScanLayer:(NSTimer *)timer

{

?CGRect frame = _scanLayer.frame;

?if(_boxView.frame.size.height < _scanLayer.frame.origin.y) {

??frame.origin.y = 0;

??_scanLayer.frame = frame;

?}else{

??frame.origin.y += 5;

??[UIView animateWithDuration:0.1animations:^{

???_scanLayer.frame = frame;

??}];

?}

}

實現(xiàn)開始和停止方法

- (IBAction)startStopReading:(id)sender {

??if(!_isReading) {

???if([self startReading]) {

????[_startBtn setTitle:@"Stop"forState:UIControlStateNormal];

????[_lblStatus setText:@"Scanning for QR Code"];

???}

??}

??else{

???[self stopReading];

???[_startBtn setTitle:@"Start!"forState:UIControlStateNormal];

??}

??_isReading = !_isReading;

}

-(void)stopReading{

?[_captureSession stopRunning];

?_captureSession = nil;

?[_scanLayer removeFromSuperlayer];

?[_videoPreviewLayer removeFromSuperlayer];

}

以上內(nèi)容就是本文給大家介紹ios原生二維碼掃描的全部內(nèi)容县爬,希望大家喜歡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末添谊,一起剝皮案震驚了整個濱河市财喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斩狱,老刑警劉巖耳高,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異所踊,居然都是意外死亡泌枪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門秕岛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碌燕,“玉大人,你說我怎么就攤上這事继薛⌒藓荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵遏考,是天一觀的道長慈鸠。 經(jīng)常有香客問我,道長灌具,這世上最難降的妖魔是什么青团? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任譬巫,我火速辦了婚禮,結(jié)果婚禮上督笆,老公的妹妹穿的比我還像新娘芦昔。我一直安慰自己,他們只是感情好胖腾,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布烟零。 她就那樣靜靜地躺著瘪松,像睡著了一般咸作。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宵睦,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天记罚,我揣著相機(jī)與錄音,去河邊找鬼壳嚎。 笑死桐智,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的烟馅。 我是一名探鬼主播说庭,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼郑趁!你這毒婦竟也來了刊驴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤寡润,失蹤者是張志新(化名)和其女友劉穎捆憎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梭纹,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡躲惰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了变抽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片础拨。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绍载,靈堂內(nèi)的尸體忽然破棺而出诡宗,到底是詐尸還是另有隱情,我是刑警寧澤逛钻,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布僚焦,位于F島的核電站,受9級特大地震影響曙痘,放射性物質(zhì)發(fā)生泄漏芳悲。R本人自食惡果不足惜立肘,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望名扛。 院中可真熱鬧谅年,春花似錦、人聲如沸肮韧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄企。三九已至超燃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拘领,已是汗流浹背意乓。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留约素,地道東北人届良。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像圣猎,于是被迫代替她去往敵國和親士葫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容