//
|
// 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 () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
|
/// 名片字符串
|
@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<NSString *,id> *)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
|