二维码
加库:coremedia corevido ,quartcore. avf. libicon
Privacy - Camera Usage Description
#import “ViewController.h”
#import “libqrencode/QRCodeGenerator.h”
#import “ZBarSDK/Headers/ZBarSDK/ZBarSDK.h”
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *inputTF;
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
@property (weak, nonatomic) IBOutlet UIImageView *resultImgView;
@property(nonatomic,strong)UIView *overLayView; // 扫描框视图
// 生成二维码图片
- (IBAction)toBeQRCodeImg:(id)sender;
// 扫描二维码图片 - (IBAction)scanQRCodeImg:(id)sender;
@end
@implementation ViewController
-(UIView *)overLayView {
if (!_overLayView) {
_overLayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
CGFloat scrW = [UIScreen mainScreen].bounds.size.width;
CGFloat scrH = [UIScreen mainScreen].bounds.size.height;
_overLayView.center = CGPointMake(scrW / 2, scrH / 2);
_overLayView.backgroundColor = [UIColor clearColor];
_overLayView.layer.borderWidth = 1.0;
_overLayView.layer.borderColor = [UIColor greenColor].CGColor;
// 扫描线
UIView *scannerLine = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 1.0)];
scannerLine.backgroundColor = [UIColor greenColor];
[_overLayView addSubview:scannerLine];
// 定时器,让扫描线动起来
[NSTimer scheduledTimerWithTimeInterval:0.088 repeats:YES block:^(NSTimer * _Nonnull timer) {
// 获取扫描线的y值
CGFloat y = scannerLine.frame.origin.y;
if (y < 200) {
y += 10;
scannerLine.frame = CGRectMake(0, y, 200, 1.0);
}
else {
y = 0;
scannerLine.frame = CGRectMake(0, y, 200, 1.0);
}
}];
}
return _overLayView;
}
-
(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
} -
(IBAction)toBeQRCodeImg:(id)sender {
if (self.inputTF.text.length == 0) {
NSLog(@“文本不可为空!”);
return;
}// 获取二维码图片
UIImage *img = [QRCodeGenerator qrImageForString:self.inputTF.text imageSize:self.resultImgView.frame.size.width];// 将二维码图片显示在图形视图上
self.resultImgView.image = img;
}
/// 扫描二维码按钮触发方法
-
(IBAction)scanQRCodeImg:(id)sender {
// 实例化一个扫描二维码控制器
ZBarReaderViewController *readVC = [[ZBarReaderViewController alloc] init];
// 设置摄像头上面的扫描框视图
readVC.cameraOverlayView = self.overLayView;// 设置代理
readVC.readerDelegate = self;
// 获取控制器中已经实例好的扫描器对象
ZBarImageScanner *scanner = readVC.scanner;
// 设置扫描器识别的图片的类型为二维码类型
[scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];
// 跳转到扫描控制器
[self presentViewController:readVC animated:YES completion:nil];
}
#pragma mark -
- (void) readerControllerDidFailToRead: (ZBarReaderController*) reader
withRetry: (BOOL) retry {
// 让扫描控制器消失
[reader dismissViewControllerAnimated:YES completion:nil];
NSLog(@“扫描二维码失败”);
}
// 获取到扫描信息后回调的方法
-
(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info {
// (1) 扫描控制器消失
[picker dismissViewControllerAnimated:YES completion:nil];// (2) 获取扫描到的二维码图片数据
UIImage *img = [info objectForKey:UIImagePickerControllerOriginalImage];
// 显示在图形视图上
self.resultImgView.image = img;// (3)提取二维码图片中的信息
// <1> 获取信息数据枚举
id results = [info objectForKey:ZBarReaderControllerResults];
// <2>遍历枚举
ZBarSymbol *symbol = nil;for (symbol in results) {
break;
}if (symbol == nil) {
NSLog(@“扫描失败”);
return;
}
// <3>获取扫描得到的信息
NSString *resultString = symbol.data;// (4) 将得到的字符串显示在标签上
self.resultLabel.text = resultString;// 如果是网址样式的字符串,做App跳转
if ([resultString hasPrefix:@“http://”] || [resultString hasPrefix:@“https://”]) {NSURL *url = [NSURL URLWithString:resultString]; [[UIApplication sharedApplication] openURL:url options:nil completionHandler:nil];
}
}
// 用户取消回调的方法
-
(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissViewControllerAnimated:YES completion:nil];
NSLog(@“用户取消”);
}