// // HMScannerViewController.m // HMQRCodeScanner // // Created by 刘凡 on 16/1/2. // Copyright © 2016年 itheima. All rights reserved. // #import "HMScannerViewController.h" #import "HMScanerCardViewController.h" #import "HMScannerBorder.h" #import "HMScannerMaskView.h" #import "HMScanner.h" /// 控件间距 #define kControlMargin 32.0 /// 相册图片最大尺寸 #define kImageMaxSize CGSizeMake(1000, 1000) @interface HMScannerViewController () /// 名片字符串 @property (nonatomic) NSString *cardName; /// 头像图片 @property (nonatomic) UIImage *avatar; /// 完成回调 @property (nonatomic, copy) void (^completionCallBack)(NSString *); @end @implementation HMScannerViewController { /// 扫描框 HMScannerBorder *scannerBorder; /// 扫描器 HMScanner *scanner; /// 提示标签 UILabel *tipLabel; } - (instancetype)initWithCardName:(NSString *)cardName avatar:(UIImage *)avatar completion:(void (^)(NSString *))completion { self = [super init]; if (self) { self.cardName = cardName; self.avatar = avatar; self.completionCallBack = completion; } return self; } - (void)viewDidLoad { [super viewDidLoad]; [self prepareUI]; // 实例化扫描器 __weak typeof(self) weakSelf = self; scanner = [HMScanner scanerWithView:self.view scanFrame:scannerBorder.frame completion:^(NSString *stringValue) { // 完成回调 weakSelf.completionCallBack(stringValue); // 关闭 [weakSelf clickCloseButton]; }]; } - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [scannerBorder startScannerAnimating]; [scanner startScan]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [scannerBorder stopScannerAnimating]; [scanner stopScan]; } #pragma mark - 监听方法 /// 点击关闭按钮 - (void)clickCloseButton { [self dismissViewControllerAnimated:YES completion:nil]; } /// 点击相册按钮 - (void)clickAlbumButton { if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { tipLabel.text = @"无法访问相册"; return; } UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.view.backgroundColor = [UIColor whiteColor]; picker.delegate = self; [self showDetailViewController:picker sender:nil]; } /// 点击名片按钮 - (void)clickCardButton { HMScanerCardViewController *vc = [[HMScanerCardViewController alloc] initWithCardName:self.cardName avatar:self.avatar]; [self showViewController:vc sender:nil]; } #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [self resizeImage:info[UIImagePickerControllerOriginalImage]]; // 扫描图像 [HMScanner scaneImage:image completion:^(NSArray *values) { if (values.count > 0) { self.completionCallBack(values.firstObject); [self dismissViewControllerAnimated:NO completion:^{ [self clickCloseButton]; }]; } else { tipLabel.text = @"没有识别到二维码,请选择其他照片"; [self dismissViewControllerAnimated:YES completion:nil]; } }]; } - (UIImage *)resizeImage:(UIImage *)image { if (image.size.width < kImageMaxSize.width && image.size.height < kImageMaxSize.height) { return image; } CGFloat xScale = kImageMaxSize.width / image.size.width; CGFloat yScale = kImageMaxSize.height / image.size.height; CGFloat scale = MIN(xScale, yScale); CGSize size = CGSizeMake(image.size.width * scale, image.size.height * scale); UIGraphicsBeginImageContext(size); [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return result; } #pragma mark - 设置界面 - (void)prepareUI { self.view.backgroundColor = [UIColor darkGrayColor]; [self prepareNavigationBar]; [self prepareScanerBorder]; [self prepareOtherControls]; } /// 准备提示标签和名片按钮 - (void)prepareOtherControls { // 1> 提示标签 tipLabel = [[UILabel alloc] init]; tipLabel.text = @"将二维码/条码放入框中,即可自动扫描"; tipLabel.font = [UIFont systemFontOfSize:12]; tipLabel.textColor = [UIColor whiteColor]; tipLabel.textAlignment = NSTextAlignmentCenter; [tipLabel sizeToFit]; tipLabel.center = CGPointMake(scannerBorder.center.x, CGRectGetMaxY(scannerBorder.frame) + kControlMargin); [self.view addSubview:tipLabel]; // 2> 名片按钮 UIButton *cardButton = [[UIButton alloc] init]; [cardButton setTitle:@"我的名片" forState:UIControlStateNormal]; cardButton.titleLabel.font = [UIFont systemFontOfSize:15]; [cardButton setTitleColor:self.navigationController.navigationBar.tintColor forState:UIControlStateNormal]; [cardButton sizeToFit]; cardButton.center = CGPointMake(tipLabel.center.x, CGRectGetMaxY(tipLabel.frame) + kControlMargin); [self.view addSubview:cardButton]; [cardButton addTarget:self action:@selector(clickCardButton) forControlEvents:UIControlEventTouchUpInside]; } /// 准备扫描框 - (void)prepareScanerBorder { CGFloat width = self.view.bounds.size.width - 80; scannerBorder = [[HMScannerBorder alloc] initWithFrame:CGRectMake(0, 0, width, width)]; scannerBorder.center = self.view.center; scannerBorder.tintColor = self.navigationController.navigationBar.tintColor; [self.view addSubview:scannerBorder]; HMScannerMaskView *maskView = [HMScannerMaskView maskViewWithFrame:self.view.bounds cropRect:scannerBorder.frame]; [self.view insertSubview:maskView atIndex:0]; } /// 准备导航栏 - (void)prepareNavigationBar { // 1> 背景颜色 [self.navigationController.navigationBar setBarTintColor:[UIColor colorWithWhite:0.1 alpha:1.0]]; self.navigationController.navigationBar.translucent = YES; self.navigationController.navigationBar.shadowImage = [[UIImage alloc] init]; // 2> 标题 self.title = @"扫一扫"; // 3> 左右按钮 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStylePlain target:self action:@selector(clickCloseButton)]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"相册" style:UIBarButtonItemStylePlain target:self action:@selector(clickAlbumButton)]; } @end