最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ios原生二維碼掃描

 更新時(shí)間:2015年09月01日 17:13:43   投稿:mrr  
本文給大家介紹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框架

#import <AVFoundation/AVFoundation.h>

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

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

整體property如下:

@property (strong, nonatomic) UIView *boxView;
@property (nonatomic) BOOL isReading;
@property (strong, nonatomic) CALayer *scanLayer;
-(BOOL)startReading;
-(void)stopReading;

//捕捉會話

@property (nonatomic, strong) AVCaptureSession *captureSession;

//展示layer

@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;

然后在ViewDidLoad方法中初始化

- (void)viewDidLoad {
  [super viewDidLoad];

  _captureSession = nil;
   _isReading = NO;
  
}

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

- (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]);
  return NO;
 }
 //3.創(chuàng)建媒體數(shù)據(jù)輸出流
 AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
 //4.實(shí)例化捕捉會話
 _captureSession = [[AVCaptureSession alloc] init];
 //4.1.將輸入流添加到會話
 [_captureSession addInput:input];
 //4.2.將媒體輸出流添加到會話中
 [_captureSession addOutput:captureMetadataOutput];
 //5.創(chuàng)建串行隊(duì)列,并加媒體輸出流添加到隊(duì)列當(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.實(shí)例化預(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];
 return YES;
}

實(shí)現(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;
  }
 }
}

實(shí)現(xiàn)計(jì)時(shí)器方法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.1 animations:^{
   _scanLayer.frame = frame;
  }];
 }
}

實(shí)現(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)容,希望大家喜歡。

相關(guān)文章

  • 開發(fā)繪圖、手勢綜合App注意點(diǎn)

    開發(fā)繪圖、手勢綜合App注意點(diǎn)

    本篇文章主要給大家詳細(xì)講述了在IOS開發(fā)繪圖、手勢綜合App容易遇到的坑以及注意事項(xiàng)等內(nèi)容,有興趣的朋友參考下吧。
    2018-02-02
  • 淺談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證

    淺談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證

    下面小編就為大家?guī)硪黄獪\談iOS應(yīng)用中的相關(guān)正則及驗(yàn)證。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • IOS生成與讀取二維碼名片

    IOS生成與讀取二維碼名片

    這篇文章主要為大家介紹了IOS生成與讀取二維碼名片的方法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • iOS中謂詞(NSPredicate)的基本入門使用教程

    iOS中謂詞(NSPredicate)的基本入門使用教程

    這篇文章主要給大家介紹了關(guān)于iOS中謂詞(NSPredicate)的基本入門使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • ios實(shí)現(xiàn)文件對比的方法

    ios實(shí)現(xiàn)文件對比的方法

    這篇文章主要介紹了ios實(shí)現(xiàn)文件對比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
    2015-05-05
  • IOS 基本文件操作實(shí)例詳解

    IOS 基本文件操作實(shí)例詳解

    這篇文章主要介紹了IOS 基本文件操作實(shí)例詳解 的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解

    iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了iOS NSCache和NSUrlCache緩存類實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解iOS中跨頁面狀態(tài)同步方案比較

    詳解iOS中跨頁面狀態(tài)同步方案比較

    這篇文章主要介紹了詳解iOS中跨頁面狀態(tài)同步方案比較,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • IOS開發(fā)實(shí)現(xiàn)手機(jī)震動的提示實(shí)例代碼

    IOS開發(fā)實(shí)現(xiàn)手機(jī)震動的提示實(shí)例代碼

    這篇文章主要介紹了IOS開發(fā)實(shí)現(xiàn)手機(jī)震動的提示實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • iOS10通知框架UserNotification理解與應(yīng)用

    iOS10通知框架UserNotification理解與應(yīng)用

    在iOS10系統(tǒng)中,通知被整合進(jìn)了UserNotification框架,除了使通知的處理脫離了UIApplication,通知功能的相關(guān)開發(fā)更加結(jié)構(gòu)化與模塊化外,還新增開放了許多更加靈活的開發(fā)接口,現(xiàn)在,開發(fā)者可以為通知定義UI末班,添加媒體附件,需要的朋友可以參考下
    2016-09-09

最新評論

宁远县| 溧阳市| 启东市| 涿鹿县| 牡丹江市| 安福县| 靖西县| 沙田区| 抚宁县| 宝丰县| 沙雅县| 台中市| 衡阳市| 山西省| 永仁县| 嘉鱼县| 莫力| 东平县| 怀柔区| 靖西县| 科技| 龙游县| 平湖市| 绥江县| 花莲县| 图木舒克市| 兴文县| 马尔康县| 达孜县| 高陵县| 兴宁市| 启东市| 曲松县| 永康市| 东城区| 宽城| 桐乡市| 普安县| 乐亭县| 南皮县| 呼伦贝尔市|