您的位置:首页 > 移动开发 > 微信开发

系统方法实现仿微信、支付宝二维码扫描 实现 (限制扫描区域、相机背景)

2014-12-29 09:34 579 查看
.h文件中做的事情:

//
// FindSweepCodeViewController.h
// Toon
//
// Created by liguoting on 14/11/3.
// Copyright (c) 2014年 syswin. All rights reserved.
//

#import "BaseViewController.h"
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import "ActivityDetailViewController.h"
#import "ActivityInfoModel.h"
@interface FindSweepCodeViewController :
BaseViewController<AVCaptureMetadataOutputObjectsDelegate>
{
int num;
BOOL upOrDown;
NSTimer *timer;
}
@property (strong,nonatomic)AVCaptureDevice *device;
@property (strong,nonatomic)AVCaptureDeviceInput *input;
@property (strong,nonatomic)AVCaptureMetadataOutput *output;
@property (strong,nonatomic)AVCaptureSession *session;
@property (strong,nonatomic)AVCaptureVideoPreviewLayer *preview;
@property (nonatomic,
retain) UIImageView *line;
@end

.m中:

//
// FindSweepCodeViewController.m
// Toon
//
// Created by liguoting on 14/11/3.
// Copyright (c) 2014年 syswin. All rights reserved.
//

#import "FindSweepCodeViewController.h"
#import "SweepResultViewController.h"
#import "CardOwnerController.h"

@interface FindSweepCodeViewController ()
{
NSString *_cardId;
NSString *_userId;
NSString *_activityId;
}

@end

@implementation FindSweepCodeViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super
initWithNibName:nibNameOrNil
bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return
self;
}

- (void)viewDidLoad
{
[super
viewDidLoad];
self.navigationItem.title =
@"二维码";
self.view.backgroundColor = [UIColor
whiteColor];
// 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((ScreenFrameWith-240)/2,
256, 240,
40)];
labIntroudction.backgroundColor = [UIColor
clearColor];
labIntroudction.font = [UIFont
systemFontOfSize:15];
labIntroudction.textAlignment =
NSTextAlignmentCenter;
labIntroudction.numberOfLines=1;
labIntroudction.textColor=[UIColor
whiteColor];
labIntroudction.text=@"将二维码放到框内即可自动扫描";
[self.view
addSubview:labIntroudction];

UIImageView * imageView = [[UIImageView
alloc]initWithFrame:CGRectMake((ScreenFrameWith-180)/2,
43, 180,
183)];
imageView.image = [UIImage
imageNamed:@"sweap_box"];
[self.view
addSubview:imageView];

upOrDown =
NO;
num =0;

/**
此块代码为扫描先上下滑动的效果,此处需求不要

:returns: return value description
*/
self.line = [[UIImageView
alloc] initWithFrame:CGRectMake((ScreenFrameWith-180)/2,
43, 180,
4)];
self.line.image = [UIImage
imageNamed:@"sweap_line"];
[self.view
addSubview:self.line];

timer = [NSTimer
scheduledTimerWithTimeInterval:.02
target:self
selector:@selector(animation1)
userInfo:nil
repeats:YES];

// Do any additional setup after loading the view from its nib.
//创建返回首页按钮
self.navigationItem.leftBarButtonItem = [ISSUtility
barButtonItemWithTarget:self
action:@selector(backBttnClickDown)
normalImage:@"header_icon_back.png"
highLightImage:@"header_icon_back.png"
title:nil
titleColor:nil
frame:CGRectMake(0,0,40,40)];

}

-(void)animation1
{
if (upOrDown ==
NO) {
num ++;
self.line.frame =
CGRectMake((ScreenFrameWith-180)/2,
43+2*num,
180, 2);
if (2*num >=
180) {
upOrDown =
YES;
}
}
else {
num --;
self.line.frame =
CGRectMake((ScreenFrameWith-180)/2,
43+2*num,
180, 2);
if (num ==
0) {
upOrDown =
NO;
}
}

}

#pragma mark ------按钮点击事件--------
-(void)backBttnClickDown
{
[self.navigationController
popViewControllerAnimated:YES];
}

-(void)backAction
{

[self.navigationController
popViewControllerAnimated:YES];
[timer
invalidate];
}

-(void)viewWillAppear:(BOOL)animated
{
AVAuthorizationStatus authStatus = [AVCaptureDevice
authorizationStatusForMediaType:AVMediaTypeVideo];

if (authStatus ==
AVAuthorizationStatusDenied)
{
UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"无法访问通讯录"
message:@"请到“设置->隐私->相机”中将toon设置为允许访问相机!"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"确定",
nil];
[alert show];

}else
{

[self
setupCamera];
}

}

#pragma mark ----alertView的代理-------
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
[self.navigationController
popViewControllerAnimated:YES];
}
- (void)setupCamera
{

// Device
_device = [AVCaptureDevice
defaultDeviceWithMediaType:AVMediaTypeVideo];

if(_device ==
nil)
{
UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"未检测到相机"
message:@"请检查相机设备是否正常"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"确定",
nil];
[alert show];
return ;
}
// Input
_input = [AVCaptureDeviceInput
deviceInputWithDevice:self.device
error:nil];

// Output
_output = [[AVCaptureMetadataOutput
alloc]init];
[_output
setMetadataObjectsDelegate:self
queue:dispatch_get_main_queue()];

//限制扫描区域(上左下右)
// [ _output setRectOfInterest : CGRectMake ( 43 / ScreenFrameHeight ,(( ScreenFrameWith - 180 )/ 2 )/ ScreenFrameWith , 183 /ScreenFrameHeight , 180 / ScreenFrameWith)];

[ _output
setRectOfInterest : CGRectMake (
43 / ScreenFrameHeight ,((
ScreenFrameWith - 150 )/
2 )/ ScreenFrameWith ,
213 /ScreenFrameHeight ,
210 / ScreenFrameWith)];
// [ _output setRectOfInterest : CGRectMake (0.5 ,0.5,0.5 , 0.5)];

// 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((ScreenFrameWith-180)/2,44,180,182);
_preview.frame =CGRectMake(0,0,ScreenFrameWith,ScreenFrameHeight-44);
[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;

}

[_session
stopRunning];
//[self.navigationController popViewControllerAnimated:YES];
[timer
invalidate];

#pragma mark -----在此处判断是否为toon内部使用的url--------
if([stringValue
hasPrefix:@"http://www.sqtoon.com/todownLoad.do?"])//判断如果为toon可识别的url
{

CardOwnerController *cardOwner = [[CardOwnerController
alloc]init];
cardOwner.type=
1;
NSString *keyValueStr = [stringValue
substringFromIndex:36];
NSLog(@"keyValueStr:%@",keyValueStr);
NSArray *tempArr = [keyValueStr
componentsSeparatedByString:@"&"];
if([tempArr
count] == 2)//说明为名片二维码
{
_cardId = [tempArr[1]
substringFromIndex:7];
NSLog(@"_cardId:%@",_cardId);
cardOwner.friendCardId = [NSString
stringWithFormat:@"%@",_cardId];
[self.navigationController
pushViewController:cardOwner
animated:YES];
}
if([tempArr
count] == 3)
{
ActivityInfoModel *model = [[ActivityInfoModel
alloc]init];
model.cardId = [tempArr[1]
substringFromIndex:7];
model.activityId = [tempArr[2]
substringFromIndex:11];
ActivityDetailViewController *detail = [[ActivityDetailViewController
alloc]initWithActivityModel:model];
[self.navigationController
pushViewController:detail
animated:YES];
}

}else
//不是toon内部url

{
SweepResultViewController *sweepResult = [[SweepResultViewController
alloc]init];
sweepResult.urlStr = stringValue;
[self.navigationController
pushViewController:sweepResult
animated:YES];

}
NSLog(@"stringValue: %@",stringValue);

}

- (void)didReceiveMemoryWarning
{
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

核心就是上面限制扫描区域的一句话,哈哈,到此你就可以去运行了;

好多人说系统方法没有第三方库的扫描速度快,这里我必须说一下,亲测系统的方法扫描速度杠杠滴;尤其是不限制扫描区域的时候,限制了之后会有所下降,但依然是很灵敏的;不得不说苹果一出,必属精品。下面是运行效果图。。。。。。。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: