|
//
// QRCodeScanView.swift
// PaiAi
//
// Created by mac on 16/7/21.
// Copyright © 2016年 FFIB. All rights reserved.
//
import UIKit
import AVFoundation
@IBDesignable class QRCodeScanView: UIView {
var qrmaskView: QRCodeMaskView? = nil
var qrscanner: QRCodeScanner? = nil
var indicatorView: UIActivityIndicatorView = {
let indicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
indicator.frame = CGRect(x: (UIScreen.main.bounds.width - 100) / 2 ,
y: (UIScreen.main.bounds.height - 100) / 2,
width: 100,
height: 100)
return indicator
}()
var configuration = QRCodeConfiguration() {
didSet {
qrmaskView?.configuration = configuration
}
}
var delegate: QRCodeScanViewDelegate? = nil
let picker = UIImagePickerController()
override func layoutSubviews() {
super.layoutSubviews()
commonInit()
}
func commonInit() {
addSubview(indicatorView)
indicatorView.startAnimating()
setQRScanner()
setMaskView()
start()
NotificationCenter.default.addObserver(self,
selector: #selector(start),
name: Notification.QRNotification.RestartNotification,
object: nil)
}
func setMaskView() {
backgroundColor = UIColor.black
qrmaskView = QRCodeMaskView(frame: CGRect(x: 0,
y: 0,
width: bounds.width,
height: bounds.height))
guard let view = qrmaskView else{ return }
view.configuration = configuration
view.backgroundColor = UIColor(r: 0, g: 0, b: 0, a: 0.2)
addSubview(view)
}
func setQRScanner() {
qrscanner = QRCodeScanner(scanRect: bounds)
guard let qrscanner = qrscanner else { return }
qrscanner.didDecodeCode = {[weak self] res in
if let weakself = self {
weakself.delegate?.scanView(weakself,
receivedScanResult: res)
weakself.qrmaskView?.stopAnimation()
weakself.indicatorView.stopAnimating()
}
}
qrscanner.didDecodeFail = {[weak self] error in
if let weakself = self {
weakself.delegate?.scanView(weakself,
didFinshWithError: error)
weakself.indicatorView.stopAnimating()
}
}
guard let previewLayer = qrscanner.previewLayer else { return }
previewLayer.frame = bounds
layer.insertSublayer(previewLayer, at: 0)
}
@objc func start() {
let queue = DispatchQueue(label: "ffib.startScan.com")
queue.async {
self.qrscanner?.startScan()
DispatchQueue.main.async {
self.qrmaskView?.startAnimation()
self.indicatorView.stopAnimating()
}
}
}
func openLight() {
guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return }
do {
try device.lockForConfiguration()
if device.hasTorch && device.isTorchAvailable{
if device.isTorchActive {
device.torchMode = .off
}else {
device.torchMode = .on
}
}
}catch {
print("open light error")
}
}
func openPhotoLibrary(ctl: UIViewController) {
indicatorView.startAnimating()
let status = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
if status == .notDetermined || status == .authorized {
picker.sourceType = .photoLibrary
picker.delegate = self
ctl.present(picker, animated: true, completion: nil)
} else {
let alert = UIAlertView(title: "拒绝访问",
message: "请在设置-隐私-相机中允许访问相册",
delegate: nil,
cancelButtonTitle: "确定")
alert.show()
}
}
}
extension QRCodeScanView: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
picker.dismiss(animated: true) {
guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
if let res = image.decodeQRCodeInImage() {
self.qrscanner?.stopScan()
self.qrmaskView?.stopAnimation()
self.delegate?.scanView(self,
receivedScanResult: QRCodeScanResult(metadataType: AVMetadataObject.ObjectType.qr.rawValue,
result: res))
} else {
let error = NSError.init(domain: "decode qr code error",
code: 101,
userInfo: nil)
self.delegate?.scanView(self,
didFinshWithError: error)
}
self.indicatorView.stopAnimating()
}
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
}
|