1.二维码生成
// 1.
实例化二维码滤镜
CIFilter *filter = [ CIFilter filterWithName : @"CIQRCodeGenerator" ];
// 2. 恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性)
[filter setDefaults ];
// 3. 将字符串转换成 NSData
NSString *str = @" 这是一句话 " ;
NSData *data = [str dataUsingEncoding : NSUTF8StringEncoding ];
// 4. 通过 KVC 设置滤镜 传入 data ,将来滤镜就知道要通过传入的数据生成二维码
[filter setValue :data forKey : @"inputMessage" ];
// 5. 获得滤镜输出的图像(生成二维码)
CIImage *outputImage = [filter outputImage ];
UIImage *image = [ UIImage imageWithCIImage :outputImage];
// 6. 设置生成好的二维码到 imageView 上,全局创建的imageView,自己随意设置
self . imageView . image = image;
CIFilter *filter = [ CIFilter filterWithName : @"CIQRCodeGenerator" ];
// 2. 恢复滤镜的默认属性(因为滤镜有可能保存上一次的属性)
[filter setDefaults ];
// 3. 将字符串转换成 NSData
NSString *str = @" 这是一句话 " ;
NSData *data = [str dataUsingEncoding : NSUTF8StringEncoding ];
// 4. 通过 KVC 设置滤镜 传入 data ,将来滤镜就知道要通过传入的数据生成二维码
[filter setValue :data forKey : @"inputMessage" ];
// 5. 获得滤镜输出的图像(生成二维码)
CIImage *outputImage = [filter outputImage ];
UIImage *image = [ UIImage imageWithCIImage :outputImage];
// 6. 设置生成好的二维码到 imageView 上,全局创建的imageView,自己随意设置
self . imageView . image = image;
2.二维码扫描
//1.实例化拍摄设备
AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
//2.设置输入设备
AVCaptureDeviceInput *input =[AVCaptureDeviceInputdeviceInputWithDevice:deviceerror:nil];
//3 设置元数据输出
//3.1 实例化拍摄元数据输出
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc]init];
//3.2 设置输出数据代理
[output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
// 4 添加拍摄会话
self.session = [[AVCaptureSessionalloc]init];
// 4.1 添加会话输入
[self.sessionaddInput:input];
// 4.2 添加会话输出
[self.sessionaddOutput:output];
// 4.3 设置输出类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 5.视频预览图层
// 5.1实例化预览图层,传递_session是为了告诉将来图层显示什么内容
self.Layer = [AVCaptureVideoPreviewLayerlayerWithSession:_session];
_Layer.videoGravity =AVLayerVideoGravityResizeAspectFill;
_Layer.frame =CGRectMake(30,100,300,300);
// 5.2 将图层插入当前视图
[self.view.layerinsertSublayer:_LayeratIndex:0];
// 启动会话
AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];
//2.设置输入设备
AVCaptureDeviceInput *input =[AVCaptureDeviceInputdeviceInputWithDevice:deviceerror:nil];
//3 设置元数据输出
//3.1 实例化拍摄元数据输出
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc]init];
//3.2 设置输出数据代理
[output setMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];
// 4 添加拍摄会话
self.session = [[AVCaptureSessionalloc]init];
// 4.1 添加会话输入
[self.sessionaddInput:input];
// 4.2 添加会话输出
[self.sessionaddOutput:output];
// 4.3 设置输出类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
// 5.视频预览图层
// 5.1实例化预览图层,传递_session是为了告诉将来图层显示什么内容
self.Layer = [AVCaptureVideoPreviewLayerlayerWithSession:_session];
_Layer.videoGravity =AVLayerVideoGravityResizeAspectFill;
_Layer.frame =CGRectMake(30,100,300,300);
// 5.2 将图层插入当前视图
[self.view.layerinsertSublayer:_LayeratIndex:0];
// 启动会话
[_sessionstartRunning];
3.二维码扫描代理事件
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
// 1.如果扫描完成,停止会话
[self.sessionstopRunning];
// 2.删除预览图层
[self.sessionstopRunning];
// 2.删除预览图层
[_LayerremoveFromSuperlayer];
// 3.设置界面显示扫描结果,如果是url,打开连接,如果不是,输出内容及显示提示框
AVMetadataMachineReadableCodeObject * metadataObject = metadataObjects[0];
NSURL * url = [NSURLURLWithString:metadataObject.stringValue
];
if ([[UIApplicationsharedApplication]canOpenURL: url]) {
[[UIApplicationsharedApplication]openURL: url];
} else {
[[UIApplicationsharedApplication]openURL: url];
} else {
UIAlertView * alertView = [[UIAlertViewalloc]initWithTitle:@"警告"message: [NSStringstringWithFormat:@"%@:%@",@"无法解析的二维码",metadataObject.stringValue
]delegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nil];
[alertViewshow];
}
}