Created
June 7, 2014 09:12
-
-
Save ruandao/356b6f50b0adfaeb660f to your computer and use it in GitHub Desktop.
二维码扫描 iOS7 && iOS 7 以上
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <UIKit/UIKit.h> | |
#import <AVFoundation/AVFoundation.h> | |
@protocol QRScannerViewControllerDelegate <NSObject> | |
- (void) catch:(NSString*)content; | |
@end | |
@interface QRScannerViewController : UIViewController | |
@property (assign, nonatomic) id<QRScannerViewControllerDelegate> delegate; | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import "QRScannerViewController.h" | |
@interface QRScannerViewController () <AVCaptureMetadataOutputObjectsDelegate> | |
{ | |
int num; | |
BOOL upOrdown; | |
NSTimer * timer; | |
} | |
@property (nonatomic)AVCaptureDevice * device; | |
@property (nonatomic)AVCaptureDeviceInput * input; | |
@property (nonatomic)AVCaptureMetadataOutput * output; | |
@property (nonatomic)AVCaptureSession * session; | |
@property (nonatomic)AVCaptureVideoPreviewLayer * preview; | |
@property (nonatomic, weak) UIImageView * line; | |
@end | |
@implementation QRScannerViewController | |
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil | |
{ | |
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; | |
if (self) { | |
// Custom initialization | |
} | |
return self; | |
} | |
- (void)viewDidLoad | |
{ | |
[super viewDidLoad]; | |
self.view.backgroundColor = [UIColor grayColor]; | |
UIButton * scanButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; | |
[scanButton setTitle:@"取消" forState:UIControlStateNormal]; | |
scanButton.frame = CGRectMake(100, 420, 120, 40); | |
[scanButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside]; | |
[self.view addSubview:scanButton]; | |
UILabel * labIntroudction= [[UILabel alloc] initWithFrame:CGRectMake(15, 40, 290, 50)]; | |
labIntroudction.backgroundColor = [UIColor clearColor]; | |
labIntroudction.numberOfLines=2; | |
labIntroudction.textColor=[UIColor whiteColor]; | |
labIntroudction.text=@"将二维码图像置于矩形方框内,离手机摄像头10CM左右,系统会自动识别。"; | |
[self.view addSubview:labIntroudction]; | |
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(10, 100, 300, 300)]; | |
imageView.image = [UIImage imageNamed:@"pick_bg"]; | |
[self.view addSubview:imageView]; | |
upOrdown = NO; | |
num =0; | |
UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(50, 110, 220, 2)]; | |
line.image = [UIImage imageNamed:@"line.png"]; | |
[self.view addSubview:line]; | |
self.line = line; | |
// 画下滑的那条线 | |
timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(animation1) userInfo:nil repeats:YES]; | |
} | |
-(void)animation1 | |
{ | |
if (upOrdown == NO) { | |
num ++; | |
self.line.frame = CGRectMake(50, 110+2*num, 220, 2); | |
if (2*num == 280) { | |
upOrdown = YES; | |
} | |
} | |
else { | |
num --; | |
self.line.frame = CGRectMake(50, 110+2*num, 220, 2); | |
if (num == 0) { | |
upOrdown = NO; | |
} | |
} | |
} | |
-(void)backAction | |
{ | |
[self dismissViewControllerAnimated:YES completion:nil]; | |
} | |
-(void)viewWillAppear:(BOOL)animated | |
{ | |
[self setupCamera]; | |
} | |
- (void)setupCamera | |
{ | |
// Device | |
_device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; | |
// Input | |
_input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; | |
// Output | |
_output = [[AVCaptureMetadataOutput alloc]init]; | |
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; | |
// Session | |
_session = [[AVCaptureSession alloc]init]; | |
[_session setSessionPreset:AVCaptureSessionPresetHigh]; | |
if ([_session canAddInput:self.input]) | |
{ | |
[_session addInput:self.input]; | |
} | |
if ([_session canAddOutput:self.output]) | |
{ | |
[_session addOutput:self.output]; | |
} | |
// 条码类型 AVMetadataObjectTypeQRCode | |
_output.metadataObjectTypes =@[AVMetadataObjectTypeQRCode]; | |
// Preview | |
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session]; | |
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill; | |
_preview.frame =CGRectMake(20,110,280,280); | |
[self.view.layer insertSublayer:self.preview atIndex:0]; | |
// Start | |
[_session startRunning]; | |
} | |
#pragma mark AVCaptureMetadataOutputObjectsDelegate | |
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection | |
{ | |
NSString *stringValue; | |
if ([metadataObjects count] >0) | |
{ | |
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0]; | |
stringValue = metadataObject.stringValue; | |
} | |
[self.delegate catch:stringValue]; | |
} | |
- (void)didReceiveMemoryWarning | |
{ | |
[super didReceiveMemoryWarning]; | |
// Dispose of any resources that can be recreated. | |
} | |
- (void)dealloc | |
{ | |
NSLog(@"%@", timer); | |
[timer invalidate]; | |
[_session stopRunning]; | |
} | |
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-(void)setupCamera | |
{ | |
QRScannerViewController * rt = [[QRScannerViewController alloc]init]; | |
rt.delegate = self; | |
[self presentViewController:rt animated:YES completion:nil]; | |
} | |
// delegate method | |
- (void)catch:(NSString *)content | |
{ | |
NSLog(content); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment