注释:此篇文章介绍如何用系统原生二维码
首先引入系统头文件
#import
然后遵守代理
AVCaptureMetadataOutputObjectsDelegate
代码如下:
@property (nonatomic,strong) AVCaptureDevice *device;//设备
@property (nonatomic,strong) AVCaptureDeviceInput *input;//输入
@property (nonatomic,strong) AVCaptureMetadataOutput *output;//输出
@property (nonatomic,strong) AVCaptureSession *session;//桥梁
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;//摄像头显示图层
@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,strong) UIView *lineView;
#pragma mark - 二维码
//初始化
- (instancetype)init
{
if(self == [super init])
{
[self createInstanceView];//创建覆盖层
[self setCamera];
}
return self;
}
- (void)createInstanceView
{
UIView *upView = [[UIView alloc] initWithFrame:CGRectMake(0, 64, UI_width, (UI_height-220*UI_width/320)/2-64)];
upView.alpha = 0.5f;
upView.backgroundColor = [UIColor blackColor];
[self.view addSubview:upView];
UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(upView.frame), (UI_width-220*UI_width/320)/2, 220*UI_width/320)];
leftView.alpha = 0.5f;
leftView.backgroundColor = [UIColor blackColor];
[self.view addSubview:leftView];
UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(UI_width-CGRectGetWidth(leftView.frame), CGRectGetMaxY(upView.frame), (UI_width-220*UI_width/320)/2, 220*UI_width/320)];
rightView.alpha = 0.5f;
rightView.backgroundColor = [UIColor blackColor];
[self.view addSubview:rightView];
UIView *downView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(leftView.frame), UI_width, (UI_height-220*UI_width/320)/2)];
downView.alpha = 0.5f;
downView.backgroundColor = [UIColor blackColor];
[self.view addSubview:downView];
}
- (void)setCamera
{
//Device
if(!self.device){
self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
}
// Input
if (!self.input) {
self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
}
// Output
if (!self.output) {
self.output = [[AVCaptureMetadataOutput alloc]init];
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
}
// Session
if (!self.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 = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];
CGFloat x = (UI_width-220*UI_width/320)/2;
CGFloat width = 220*UI_width/320;
CGFloat height = 220*UI_width/320;
CGFloat y = (UI_height-220*UI_width/320)/2;
CGRect scanCrop = [self getScanCrop:CGRectMake(x, y, width, height) readerViewBounds:self.view.frame];
self.output.rectOfInterest = scanCrop;
// Preview
if(!self.previewLayer){
self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
// self.previewLayer.frame = CGRectMake((UI_width-220*UI_width/320)/2, (UI_height-220*UI_width/320)/2,220*UI_width/320, 220*UI_width/320);
self.previewLayer.frame = self.view.frame;
[self.view.layer insertSublayer:self.previewLayer atIndex:0];
}
[self.session startRunning];
}
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds {
CGFloat x,y,width,height;
x = rect.origin.y/UI_height - 0.1;
y = rect.origin.x/UI_width;
width = rect.size.height/UI_height;
height = rect.size.width/UI_width;
return CGRectMake(x, y, width, height);
}
#pragma mark AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if ([metadataObjects count] >0){
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
NSLog(@"metadataObject.stringValue = %@ \n metadataObject.corners = %@",metadataObject.stringValue,metadataObject.corners);//扫描后输出信息
if([[metadataObject.stringValue substringToIndex:7] isEqualToString:@"http://"])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",metadataObject.stringValue]]];
}
else if ([[metadataObject.stringValue substringToIndex:4] isEqualToString:@"www."])
{
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://%@",metadataObject.stringValue]]];
}
else
{
[Helper helperPointWithTitle:metadataObject.stringValue];
[self.session startRunning];
}
[self.session stopRunning];
[self.timer invalidate];
}
}
//注意,在界面消失的时候关闭session
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.session stopRunning];
}
//以下是UI,动画扫描
- (void)createUI
{
UIImageView *bgImageView = [YYTools createImageViewWithFrame:CGRectMake(0, 0, 265*UI_width/320, 265*UI_width/320) andBackgroundColor:[UIColor clearColor] andImage:@"bg_scanner.png" andObject:nil andSEL:nil andTag:0];
bgImageView.center = self.view.center;
[self.view addSubview:bgImageView];
self.lineView = [YYTools createViewWithFrame:CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2, 270*UI_width/320, 1) andBackgroundColoc:[UIColor greenColor]];
self.lineView.layer.cornerRadius = 8;
[self.view addSubview:self.lineView];//+220*UI_width/320
if(!self.timer)
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(animatedTimer) userInfo:nil repeats:YES];
}
}
- (void)animatedTimer
{
if(self.lineView.frame.origin.y == (UI_height-220*UI_width/320)/2)
{
[UIView animateWithDuration:1.0f animations:^{
self.lineView.frame = CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2+220*UI_width/320, 270*UI_width/320, 1);
}];
}
else if ((UI_height-220*UI_width/320)/2+220*UI_width/320)
{
[UIView animateWithDuration:1.0f animations:^{
self.lineView.frame = CGRectMake((UI_width-270*UI_width/320)/2, (UI_height-220*UI_width/320)/2, 270*UI_width/320, 1);
}];
}
}
效果图如下: