標籤:
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二維碼掃描(系統內建的二維碼掃描)