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

ios原生二維碼掃描

 更新時間:2015年09月01日 17:13:43   投稿:mrr  
本文給大家介紹ios原生二維碼掃描,有需要的朋友可以參考下

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

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

一、做好準備工作,搭建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

首先導入AVFoundation框架

#import <AVFoundation/AVFoundation.h>

然后控制器實現(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;
  
}

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

- (BOOL)startReading {
 NSError *error;
 //1.初始化捕捉設備(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ù)據輸出流
 AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
 //4.實例化捕捉會話
 _captureSession = [[AVCaptureSession alloc] init];
 //4.1.將輸入流添加到會話
 [_captureSession addInput:input];
 //4.2.將媒體輸出流添加到會話中
 [_captureSession addOutput:captureMetadataOutput];
 //5.創(chuàng)建串行隊列,并加媒體輸出流添加到隊列當中
 dispatch_queue_t dispatchQueue;
 dispatchQueue = dispatch_queue_create("myQueue", NULL);
 //5.1.設置代理
 [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
 //5.2.設置輸出媒體數(shù)據類型為QRCode
 [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
 //6.實例化預覽圖層
 _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
 //7.設置預覽圖層填充方式
 [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
 //8.設置圖層的frame
 [_videoPreviewLayer setFrame:_viewPreview.layer.bounds];
 //9.將圖層添加到預覽view的圖層上
 [_viewPreview.layer addSublayer:_videoPreviewLayer];
 //10.設置掃描范圍
 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;
}

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

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
 //判斷是否有數(shù)據
 if (metadataObjects != nil && [metadataObjects count] > 0) {
  AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
  //判斷回傳的數(shù)據類型
  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.1 animations:^{
   _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];
}

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

相關文章

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

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

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

    淺談iOS應用中的相關正則及驗證

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

    IOS生成與讀取二維碼名片

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

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

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

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

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

    IOS 基本文件操作實例詳解

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

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

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

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

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

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

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

    iOS10通知框架UserNotification理解與應用

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

最新評論

达日县| 望都县| 平和县| 清水县| 澄迈县| 西乌珠穆沁旗| 南部县| 莱阳市| 柯坪县| 蓬安县| 吉木乃县| 靖边县| 长岛县| 梁山县| 南和县| 潍坊市| 周口市| 广汉市| 固原市| 太仓市| 黄浦区| 婺源县| 许昌市| 荣成市| 淮安市| 海门市| 格尔木市| 荃湾区| 昂仁县| 封丘县| 汕头市| 凌云县| 闽清县| 教育| 安岳县| 三台县| 兖州市| 曲沃县| 通山县| 左云县| 南充市|