從iOS7開始集成了二維碼的生成和讀取功能亿遂,此前被廣泛使用的zbarsdk目前不支持64位處理器
下面來詳細(xì)介紹生成二維碼和掃描二維碼:
1 - 生成二維碼
生成二維碼的步驟:
1.導(dǎo)入CoreImage框架
2.通過濾鏡CIFilter生成二維碼
Snip20151014_4.png
二維碼的內(nèi)容(傳統(tǒng)的條形碼只能放數(shù)字):
- 純文本
- 名片
- URL
詳細(xì)代碼實現(xiàn)
1 - 先在storyboard中拖入一個200×200大小的image,并使其居中
2 - 以下為實現(xiàn)代碼
#import "ViewController.h"
#import <CoreImage/CoreImage.h>
#import "UIImage+TwoDimensionCode.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建過濾器(CIQRCodeGenerator)
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢復(fù)默認(rèn)
[filter setDefaults];
// 3.給過濾器添加數(shù)據(jù)(正則表達式/賬號和密碼)
NSString *dataString = @"http://www.baidu.com"; // URL
// NSString *dataString = @"cwz"; // 文本
// 這里要轉(zhuǎn)為UTF-8
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKeyPath:@"inputMessage"];
// 4.獲取輸出的二維碼
CIImage *outputImage = [filter outputImage];
// 5.顯示二維碼
self.imageView.image = [UIImage createNonInterpolatedUIImageFormCIImage:outputImage withSize:200];
}
@end
3 - 看下輸出的效果
這時展現(xiàn)出來的會比較模糊,所以用到另外一個image的拓展來將他變清晰一些
有的需求可能還需要在生成的二維碼上加上自己的logo或者別的圖片
可以在生成的二維碼上在根據(jù)自己的需求添加一層view或者image
Snip20151014_18.png
2 - 掃描二維碼
-
讀取二維碼需要導(dǎo)入AVFoundation框架
- 利用攝像頭識別二維碼中的內(nèi)容(模擬器不行)
實現(xiàn)步驟:
1.輸入(攝像頭)
2.由會話將攝像頭采集到的二維碼圖像轉(zhuǎn)換成字符串?dāng)?shù)據(jù)
3.輸出(數(shù)據(jù))
4.由預(yù)覽圖層顯示掃描場景
代碼實現(xiàn)
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController () <AVCaptureMetadataOutputObjectsDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.創(chuàng)建捕捉會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// 2.設(shè)置輸入設(shè)備
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:inputDevice];
// 3.設(shè)置輸入方式
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 4.添加一個顯示的layer
AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
// 5.開始掃描
[session startRunning];
}
#pragma mark - 獲取掃描結(jié)果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
}
}
@end