Ios二維碼掃描(系統內建的二維碼掃描)

來源:互聯網
上載者:User

標籤:

Ios二維碼掃描

 

  這裡給大家介紹的時如何使用系統內建的二維碼掃描方法和一些簡單的動畫!

操作步驟:

  1).首先你需要搭建UI介面我用了倆個imageview和一個label

          

   2)、你需要在你當前的控制器中匯入

        #import <AVFoundation/AVFoundation.h>

        <AVCaptureMetadataOutputObjectsDelegate>代理

   3)、在@interface中定義    

      @property (nonatomic,strong)AVCaptureDevice * device;

      @property (nonatomic,strong)AVCaptureDeviceInput * input;

      @property (nonatomic,strong)AVCaptureMetadataOutput * output;

      @property (nonatomic,strong)AVCaptureSession * session;

      @property (nonatomic,strong)AVCaptureVideoPreviewLayer * preview;

    4)、將UI介面中的倆個圖片屬性拖進來

      @property (strong, nonatomic) IBOutlet UIImageView *preReferImage;//這個是UI介面中的框子圖片

      @property (nonatomic,strong)IBOutlet UIImageView * imageLine;//這個是UI介面中的綠色線條圖片

    5)、就是將如下代碼放進你的控制器中   

  - (void)viewDidLoad

    {

          [super viewDidLoad];

          [self setupCamera];//設定相機

}

    //設定相機

  -(void)setupCamera

    {

        // Device 屬性 

        self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        // Input 屬性

        NSError *error = nil;

        self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:&error];

       if (error) {

            NSLog(@"錯誤");

            return;

        }

        // Output 屬性

        self.output = [[AVCaptureMetadataOutput alloc]init];

        [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

        // Session 屬性

        self.session = [[AVCaptureSession alloc]init];

        [self.session setSessionPreset:AVCaptureSessionPresetHigh];

       if ([self.session canAddInput:self.input])

      {

           [self.session addInput:self.input];

      }

        if ([self.session canAddOutput:self.output])

      {

           [self.session addOutput:self.output];

      }

      self.output.metadataObjectTypes [email protected][AVMetadataObjectTypeQRCode];//這裡是設定掃描的類型

      // Preview 屬性

      self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

      self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

      self.preview.frame = self.view.bounds;

      [self.view.layer insertSublayer:self.preview below:self.preReferImage.layer];  

      // Start 屬性

      [self.session startRunning];  

    [self setupAnimation];//這個是橫線的上下掃描動畫,可添加可不添加

   }

/**注意了:你如果需要添加這個橫線掃描的動畫需要在@interface中添加如下幾個屬性*/

{

    int lineValue; //儲存橫線的frame值

    NSTimer * timer;//定時器讓橫線走動

    BOOL Down;//向下

    BOOL up;//向上

}

  //橫線動畫

 - (void)setupAnimation

  {

      CGFloat beginLineValue = CGRectGetMinY(self.preReferImage.frame);

      Down = YES;

      up = NO;

      lineValue =beginLineValue;

      [timer invalidate];

      timer = [NSTimer scheduledTimerWithTimeInterval:.01

            target:self selector:@selector(animation1) userInfo:nil repeats:YES];

}

 -(void)animation1

  {

    if (Down) {

         CGFloat maxValue = CGRectGetMaxY(self.preReferImage.frame);

         lineValue++;

        self.imageLine.frame = CGRectMake(self.imageLine.frame.origin.x,lineValue, self.imageLine.frame.size.width, self.imageLine.frame.size.height);

        if (lineValue ==maxValue) {

            up = YES;

        }

    }

      if (up){

          CGFloat minValue = CGRectGetMinY(self.preReferImage.frame);

          lineValue-=2;

          self.imageLine.frame = CGRectMake(self.imageLine.frame.origin.x, lineValue, self.imageLine.frame.size.width, self.imageLine.frame.size.height);

        if (lineValue ==minValue) {

            Down = YES;

            up = NO;

        }

    }

}

 

/**這個是必須要實現的代理方法,從這個方法中可以得到所掃描出來的URL*/

#pragma mark - AVCaptureMetadataOutputObjectsDelegate

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

{

    NSString * stringValue ;

    if ([metadataObjects count] > 0) {

        [self.session stopRunning];

        AVMetadataMachineReadableCodeObject * metadataObj = [metadataObjects objectAtIndex:0];

        stringValue = metadataObj.stringValue;

        [timer invalidate];//這個是掃描成功後停止動畫

        timer = nil;

        [self requestParsing:stringValue]; //這個是掃描成功後所做的網路要求方法,可以注釋

        NSLog(@"stringValue =%@",stringValue);

    }

}

 /**注意:

    1、以上這個例子只是說明如何使用系統內建的二維碼掃描,沒有做掃描成功後進行網路訪問;

    2、這個二維碼掃描除開中間圖片框式可以看見外其他螢幕也是可以看見的,我的解決方案是添加一個View跟當前的這個View是在同一層次上不透明就可以了

    這個掃描中用到的架構有:

        AFNetworking    這個是用來網路請求的

        MBProgressHUD  這個是用來載入網路是的提示的,例如網路載入中的時候,就會彈出一個框:正在載入中。。。等等!

  當然還有第三方的二維碼掃描:ZXing和ZBar在github上都有下載

*/

Ios二維碼掃描(系統內建的二維碼掃描)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.