iOS之基础知识iOS之功能细节

27 - 二维码

2017-07-02  本文已影响10人  RadioWaves

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


1 - 生成二维码

生成二维码的步骤:

1.导入CoreImage框架



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


Snip20151014_4.png

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

详细代码实现

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 - 扫描二维码

实现步骤:

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
上一篇下一篇

猜你喜欢

热点阅读