27 - 二维码
2017-07-02 本文已影响10人
RadioWaves
从iOS7开始集成了二维码的生成和读取功能,此前被广泛使用的zbarsdk目前不支持64位处理器
下面来详细介绍生成二维码和扫描二维码:
1 - 生成二维码
生成二维码的步骤:
1.导入CoreImage框架
2.通过滤镜CIFilter生成二维码
Snip20151014_4.png
二维码的内容(传统的条形码只能放数字):
- 纯文本
- 名片
- URL
详细代码实现
1 - 先在storyboard中拖入一个200×200大小的image,并使其居中
2 - 以下为实现代码
#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.创建过滤器(CIQRCodeGenerator)
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.恢复默认
[filter setDefaults];
// 3.给过滤器添加数据(正则表达式/账号和密码)
NSString *dataString = @"http://www.baidu.com"; // URL
// NSString *dataString = @"cwz"; // 文本
// 这里要转为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 - 看下输出的效果
这时展现出来的会比较模糊,所以用到另外一个image的拓展来将他变清晰一些
有的需求可能还需要在生成的二维码上加上自己的logo或者别的图片
可以在生成的二维码上在根据自己的需求添加一层view或者image
Snip20151014_18.png
2 - 扫描二维码
-
读取二维码需要导入AVFoundation框架
- 利用摄像头识别二维码中的内容(模拟器不行)
实现步骤:
1.输入(摄像头)
2.由会话将摄像头采集到的二维码图像转换成字符串数据
3.输出(数据)
4.由预览图层显示扫描场景
代码实现
#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.创建捕捉会话
AVCaptureSession *session = [[AVCaptureSession alloc] init];
// 2.设置输入设备
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
AVCaptureDeviceInput *inputDevice = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:inputDevice];
// 3.设置输入方式
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 - 获取扫描结果
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
if (metadataObjects.count > 0) {
AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
NSLog(@"%@", object.stringValue);
}
}
@end