27 - 二维码

从iOS7开始集成了二维码的生成和读取功能,此前被广泛使用的zbarsdk目前不支持64位处理器
下面来详细介绍生成二维码和扫描二维码:


1 - 生成二维码

生成二维码的步骤:

1.导入CoreImage框架



2.通过滤镜CIFilter生成二维码


Snip20151014_4.png

二维码的内容(传统的条形码只能放数字):

  • 纯文本
  • 名片
  • URL

详细代码实现

1 - 先在storyboard中拖入一个200×200大小的image,并使其居中


27 - 二维码_第1张图片

2 - 以下为实现代码

#import "ViewController.h"
#import 
#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 - 看下输出的效果


27 - 二维码_第2张图片

这时展现出来的会比较模糊,所以用到另外一个image的拓展来将他变清晰一些


27 - 二维码_第3张图片
27 - 二维码_第4张图片

有的需求可能还需要在生成的二维码上加上自己的logo或者别的图片
可以在生成的二维码上在根据自己的需求添加一层view或者image


27 - 二维码_第5张图片
Snip20151014_18.png

2 - 扫描二维码

  • 读取二维码需要导入AVFoundation框架


  • 利用摄像头识别二维码中的内容(模拟器不行)

实现步骤:

1.输入(摄像头)
2.由会话将摄像头采集到的二维码图像转换成字符串数据
3.输出(数据)
4.由预览图层显示扫描场景

代码实现

#import "ViewController.h"
#import 
@interface ViewController () 

@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
27 - 二维码_第6张图片

你可能感兴趣的:(27 - 二维码)