QRCode 二維碼的學習:web
須要倒入一個框架 AVFoundation數組
1.須要有輸入設備, 瀏覽器
2.輸出設備 (解析輸入設備的內容)session
3.有一個會話類(輸入輸出完事了須要哪個是輸入那一個是輸出)app
AVCaptureSession 框架
4。一個展現掃描的內容 layeride
二 : 而後建立學習
三:設置代理 --獲取數據優化
會話類不知道哪個是時輸入設備 哪個是 輸出設備的 須要銜接她們atom
去綁定輸入和輸出設備 (作一個是否的判斷)、
四:設置掃描類型
五:開始掃描
[self.session startRunning]
六:完成代理方法去處理二維碼
掃描到的是一個數據數組
還須要去找到一個類(是一個類型的) (細節頭文件是沒有提示的) 跳到方法裏去
獲取到了數據 裏面有兩個屬性 obj.stringvalue
七:在iOS9裏面又一個特殊服務 能夠不用加載webview 能夠方便展現網頁
細節:(自帶一相似導航欄的東西 完成 刷新 還帶有分享 也就是系統真正的瀏覽器)
好處:網頁過長的時候 在滾動的過程當中是沒有那個tabbar和導航欄的
只有在最上面的時候纔會顯示那個的tabbar和導航欄
若是你的SFSafariViewController
//
// GASScanViewController.m
// GasManger
//
// Created by Ninesday on 16/6/1.
// Copyright © 2016年 Ninesday. All rights reserved.
//
#import "GASScanViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <SafariServices/SafariServices.h>
@interface GASScanViewController ()<AVCaptureMetadataOutputObjectsDelegate>
//1.輸入設備
@property (nonatomic,strong)AVCaptureDeviceInput *input;
//2.輸出設備
@property (nonatomic,strong)AVCaptureMetadataOutput *output;
//3.會話類
@property (nonatomic,strong) AVCaptureSession *session;
//4.掃描到內容的layer
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewlayer;
@end
@implementation GASScanViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//輸入設備
//得先建立設備
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
self.input = [[AVCaptureDeviceInput alloc]initWithDevice:device error:nil];
//輸出設備
self.output = [AVCaptureMetadataOutput new];
//會話類
self.session = [AVCaptureSession new];
//綁定設備
if ([self.session canAddInput:self.input]) {
[self.session addInput:self.input];
}
if ([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
//設置代理獲取數據
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//設置掃描的類型
[self.output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
//掃描到內容layer--須要設置會話
self.previewlayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:self.session];
self.previewlayer.frame = self.view.bounds;
[self.view.layer addSublayer:self.previewlayer];
//開始掃描
[self.session startRunning];
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
if (metadataObjects.count >0) {
//1.中止掃描
[self.session stopRunning];
//刪除layer
[self.previewlayer removeFromSuperlayer];
//獲取數據 AVMetadataMachineReadableCodeObject 頭文件沒提示
AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
NSLog(@"%@", obj.stringValue);
if ([obj.stringValue hasPrefix:@"http"]) {
//iOS9新增長的
SFSafariViewController *sf = [[SFSafariViewController alloc]initWithURL:[NSURL URLWithString:obj.stringValue]];
[self presentViewController:sf animated:sf completion:nil];
}
}
}
@end
八:二維碼的優化
導入一個封裝的類
重置類型
二維碼的掃描
iOS7 平臺以後纔有 流行的框架 ZBar ZXing
總結:
1.輸入設備
2.輸出
3.會話
4.代理
5.掃描類型
6.展現掃描到的內容
7.開始掃描
8.代理方法中進行解析
1.中止掃描
2.刪除layer
3.獲取數據 AVMetadataMachReadableCodeObject 頭文件沒提示