From 74c7b6c7ac226c39e5ce252af234dc50efa38e74 Mon Sep 17 00:00:00 2001 From: 无故事王国 <841720330@qq.com> Date: 星期二, 05 三月 2024 19:33:39 +0800 Subject: [PATCH] fix --- WanPai/Common/VC/CommonScanQRCodeVC.swift | 600 ++++++++++++++++++++++++++++++------------------------------ 1 files changed, 300 insertions(+), 300 deletions(-) diff --git a/WanPai/Common/VC/CommonScanQRCodeVC.swift b/WanPai/Common/VC/CommonScanQRCodeVC.swift index 6474106..a4dcb21 100644 --- a/WanPai/Common/VC/CommonScanQRCodeVC.swift +++ b/WanPai/Common/VC/CommonScanQRCodeVC.swift @@ -12,341 +12,341 @@ class CommonScanQRCodeVC: BaseVC,AVCaptureMetadataOutputObjectsDelegate { - //是否是第一次扫描到结果 - public var firstResult: Bool = true - //AVCaptureSession对象来执行输入设备和输出设备之间的数据传递 - public var session: AVCaptureSession? - //输入设备 - public var videoInput: AVCaptureDeviceInput? - //输出对象 - public var metadataOutput: AVCaptureMetadataOutput = AVCaptureMetadataOutput() - //预览图层 - public var previewLayer: AVCaptureVideoPreviewLayer? - public var scanTimer: Timer? - //边框 - public var borderView:UIImageView? - //line - public var scanLineView:UIImageView? - //返回按钮 - public var closeBtn:UIButton? + //是否是第一次扫描到结果 + public var firstResult: Bool = true + //AVCaptureSession对象来执行输入设备和输出设备之间的数据传递 + public var session: AVCaptureSession? + //输入设备 + public var videoInput: AVCaptureDeviceInput? + //输出对象 + public var metadataOutput: AVCaptureMetadataOutput = AVCaptureMetadataOutput() + //预览图层 + public var previewLayer: AVCaptureVideoPreviewLayer? + public var scanTimer: Timer? + //边框 + public var borderView:UIImageView? + //line + public var scanLineView:UIImageView? + //返回按钮 + public var closeBtn:UIButton? - private let borderWidth:CGFloat = 400 - private let topMargin: CGFloat = 230 - private var clouse:((String,Bool)->Void)? + private let borderWidth:CGFloat = 400 + private let topMargin: CGFloat = 230 + private var clouse:((String,Bool)->Void)? - /// 返回扫描结果,是否时第一次扫描到结果 - public convenience init(clouse:@escaping (String,Bool)->Void){ - self.init() - self.clouse = clouse - } - - public override func viewDidLoad() { - super.viewDidLoad() - title = "扫描二维码" - if UIImagePickerController.isSourceTypeAvailable(.camera){ - - if borderView == nil { - borderView = UIImageView(image: UIImage(named: "ty_qrcode_bg")) - } - - if scanLineView == nil { - scanLineView = UIImageView(image: UIImage(named: "ty_qrcode_line")) - } - - if closeBtn == nil && modalPresentationStyle == .fullScreen && self.presentationController != nil { - closeBtn = UIButton(type: .custom) - closeBtn!.addTarget(self, action: #selector(closeView), for: .touchUpInside) - let image = Bundle.JQ_Bundle(icon: "close_btn") - closeBtn!.setImage(image, for: .normal) - view.addSubview(closeBtn!) - closeBtn!.snp.makeConstraints { (make) in - make.top.equalTo(30) - make.left.equalTo(20) - make.width.height.equalTo(30) - } - } - - let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) - if authStatus == AVAuthorizationStatus.notDetermined { - AVCaptureDevice.requestAccess(for: AVMediaType.video) { (granted) in - if granted{ - self.limitSuccess() - }else{ - self.limitFaild() - } - } - } else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied { - limitFaild() - } else { - limitSuccess() - } - }else{ - alertError(msg: "当前环境相机不可用") - DispatchQueue.main.asyncAfter(deadline: .now()+1) { - self.navigationController?.popViewController() - } - } - - -// if(!checkCameraAuth()){ -// -// let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) -// if authStatus == AVAuthorizationStatus.notDetermined { -// AVCaptureDevice.requestAccess(for: AVMediaType.video) {[weak self] (granted) in -// if granted{ -// self?.setupCaptureSession() -// self?.addSubviews() -// self?.scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(startAnimation), userInfo: nil, repeats: true) -// } -// } -// } else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied { -// let alertController = UIAlertController(title: nil,message: "请在iphone的“设置-隐私-相机”选项中,允许应用访问你的相机", preferredStyle: .alert) -// let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: { action in -// self.navigationController?.popViewController(animated: true) -// }) -// -// let okAction = UIAlertAction(title: "前往", style: .default, handler: {action in -// let settingUrl = NSURL(string: UIApplication.openSettingsURLString)! -// if UIApplication.shared.canOpenURL(settingUrl as URL){ -// if #available(iOS 10.0, *) { -// UIApplication.shared.open(settingUrl as URL, options: [:], completionHandler: nil) -// } else { -// UIApplication.shared.openURL(settingUrl as URL) -// } -// } -// }) -// -// alertController.addAction(cancelAction) -// alertController.addAction(okAction) -// self.present(alertController, animated: true, completion: nil) -// } else { -// -// } -// -// }else{ -// setupCaptureSession() -// addSubviews() -// scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(startAnimation), userInfo: nil, repeats: true) -// } - } - - private func limitSuccess(){ - setupCaptureSession() - DispatchQueue.main.async { - self.addSubviews() - self.scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.startAnimation), userInfo: nil, repeats: true) - - self.firstResult = true - if let session = self.session { - let queue = DispatchQueue(label: "startRun") - queue.async { - session.startRunning() - } - } - self.scanTimer?.fireDate = NSDate.distantPast - } - } - - private func limitFaild(){ - DispatchQueue.main.async { - let alertController = UIAlertController(title: nil,message: "请在iphone的“设置-隐私-相机”选项中,允许应用访问你的相机", preferredStyle: .alert) - let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: { action in - if self.qmui_isPresented(){ - self.dismiss(animated: true) - }else{ - self.navigationController?.popViewController(animated: true) - } - }) - - let okAction = UIAlertAction(title: "前往", style: .default, handler: {action in - - if self.qmui_isPresented(){ - self.dismiss(animated: true) - }else{ - self.navigationController?.popViewController(animated: true) + /// 返回扫描结果,是否时第一次扫描到结果 + public convenience init(clouse:@escaping (String,Bool)->Void){ + self.init() + self.clouse = clouse } + public override func viewDidLoad() { + super.viewDidLoad() + title = "扫描二维码" + if UIImagePickerController.isSourceTypeAvailable(.camera){ - let settingUrl = NSURL(string: UIApplication.openSettingsURLString)! - if UIApplication.shared.canOpenURL(settingUrl as URL){ - if #available(iOS 10.0, *) { - UIApplication.shared.open(settingUrl as URL, options: [:], completionHandler: nil) - } else { - UIApplication.shared.openURL(settingUrl as URL) - } + if borderView == nil { + borderView = UIImageView(image: UIImage(named: "ty_qrcode_bg")) + } + + if scanLineView == nil { + scanLineView = UIImageView(image: UIImage(named: "ty_qrcode_line")) + } + + if closeBtn == nil && modalPresentationStyle == .fullScreen && self.presentationController != nil { + closeBtn = UIButton(type: .custom) + closeBtn!.addTarget(self, action: #selector(closeView), for: .touchUpInside) + let image = Bundle.JQ_Bundle(icon: "close_btn") + closeBtn!.setImage(image, for: .normal) + view.addSubview(closeBtn!) + closeBtn!.snp.makeConstraints { (make) in + make.top.equalTo(30) + make.left.equalTo(20) + make.width.height.equalTo(30) + } + } + + let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) + if authStatus == AVAuthorizationStatus.notDetermined { + AVCaptureDevice.requestAccess(for: AVMediaType.video) { (granted) in + if granted{ + self.limitSuccess() + }else{ + self.limitFaild() + } + } + } else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied { + limitFaild() + } else { + limitSuccess() + } + }else{ + alertError(msg: "当前环境相机不可用") + DispatchQueue.main.asyncAfter(deadline: .now()+1) { + self.navigationController?.popViewController() + } + } + + + // if(!checkCameraAuth()){ + // + // let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video) + // if authStatus == AVAuthorizationStatus.notDetermined { + // AVCaptureDevice.requestAccess(for: AVMediaType.video) {[weak self] (granted) in + // if granted{ + // self?.setupCaptureSession() + // self?.addSubviews() + // self?.scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(startAnimation), userInfo: nil, repeats: true) + // } + // } + // } else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied { + // let alertController = UIAlertController(title: nil,message: "请在iphone的“设置-隐私-相机”选项中,允许应用访问你的相机", preferredStyle: .alert) + // let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: { action in + // self.navigationController?.popViewController(animated: true) + // }) + // + // let okAction = UIAlertAction(title: "前往", style: .default, handler: {action in + // let settingUrl = NSURL(string: UIApplication.openSettingsURLString)! + // if UIApplication.shared.canOpenURL(settingUrl as URL){ + // if #available(iOS 10.0, *) { + // UIApplication.shared.open(settingUrl as URL, options: [:], completionHandler: nil) + // } else { + // UIApplication.shared.openURL(settingUrl as URL) + // } + // } + // }) + // + // alertController.addAction(cancelAction) + // alertController.addAction(okAction) + // self.present(alertController, animated: true, completion: nil) + // } else { + // + // } + // + // }else{ + // setupCaptureSession() + // addSubviews() + // scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(startAnimation), userInfo: nil, repeats: true) + // } } - }) - alertController.addAction(cancelAction) - alertController.addAction(okAction) - self.present(alertController, animated: true, completion: nil) - } - } + private func limitSuccess(){ + setupCaptureSession() + DispatchQueue.main.async { + self.addSubviews() + self.scanTimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(self.startAnimation), userInfo: nil, repeats: true) - func checkCameraAuth() -> Bool { - let status = AVCaptureDevice.authorizationStatus(for: .video) - return status == .authorized; - } + self.firstResult = true + if let session = self.session { + let queue = DispatchQueue(label: "startRun") + queue.async { + session.startRunning() + } + } + self.scanTimer?.fireDate = NSDate.distantPast + } + } - //MARK:生成背景遮盖 - func getCoverView(left: CGFloat, top: CGFloat) -> UIImage? { - UIGraphicsBeginImageContext(CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 64)) - let contextRef = UIGraphicsGetCurrentContext() - contextRef?.setFillColor(UIColor (red: 111/255.0, green: 111/255.0, blue: 22/255.0, alpha: 0.5).cgColor) - contextRef?.fill(CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)) - let inset:CGFloat = 4 - contextRef?.clear(CGRect(x: left + inset, y: top + inset, width: UIScreen.main.bounds.size.width - left * 2 - inset * 2, height: UIScreen.main.bounds.size.width - left * 2 - inset * 2)) - return UIGraphicsGetImageFromCurrentImageContext() - } + private func limitFaild(){ + DispatchQueue.main.async { + let alertController = UIAlertController(title: nil,message: "请在iphone的“设置-隐私-相机”选项中,允许应用访问你的相机", preferredStyle: .alert) + let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: { action in + if self.qmui_isPresented(){ + self.dismiss(animated: true) + }else{ + self.navigationController?.popViewController(animated: true) + } + }) - func addSubviews() { - let _: CGFloat = (UIScreen.main.bounds.size.width - borderWidth) * 0.5 + let okAction = UIAlertAction(title: "前往", style: .default, handler: {action in - // + if self.qmui_isPresented(){ + self.dismiss(animated: true) + }else{ + self.navigationController?.popViewController(animated: true) + } - // let coverImageView = UIImageView(frame: CGRect(x: 0, y: 64, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 64)) - // coverImageView.backgroundColor = UIColor.clear - // coverImageView.image = self.getCoverView(left: leftMargin, top: topMargin) - // view.addSubview(coverImageView) + + let settingUrl = NSURL(string: UIApplication.openSettingsURLString)! + if UIApplication.shared.canOpenURL(settingUrl as URL){ + if #available(iOS 10.0, *) { + UIApplication.shared.open(settingUrl as URL, options: [:], completionHandler: nil) + } else { + UIApplication.shared.openURL(settingUrl as URL) + } + } + }) + + alertController.addAction(cancelAction) + alertController.addAction(okAction) + self.present(alertController, animated: true, completion: nil) + } + } + + func checkCameraAuth() -> Bool { + let status = AVCaptureDevice.authorizationStatus(for: .video) + return status == .authorized; + } + + //MARK:生成背景遮盖 + func getCoverView(left: CGFloat, top: CGFloat) -> UIImage? { + UIGraphicsBeginImageContext(CGSize(width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 64)) + let contextRef = UIGraphicsGetCurrentContext() + contextRef?.setFillColor(UIColor (red: 111/255.0, green: 111/255.0, blue: 22/255.0, alpha: 0.5).cgColor) + contextRef?.fill(CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height)) + let inset:CGFloat = 4 + contextRef?.clear(CGRect(x: left + inset, y: top + inset, width: UIScreen.main.bounds.size.width - left * 2 - inset * 2, height: UIScreen.main.bounds.size.width - left * 2 - inset * 2)) + return UIGraphicsGetImageFromCurrentImageContext() + } + + func addSubviews() { + let _: CGFloat = (UIScreen.main.bounds.size.width - borderWidth) * 0.5 + + // + + // let coverImageView = UIImageView(frame: CGRect(x: 0, y: 64, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height - 64)) + // coverImageView.backgroundColor = UIColor.clear + // coverImageView.image = self.getCoverView(left: leftMargin, top: topMargin) + // view.addSubview(coverImageView) - //扫描边框 - borderView!.frame = CGRect.init(x: (UIScreen.main.bounds.size.width-(self.view.center.x+30))/2, y: (UIScreen.main.bounds.size.height-(self.view.center.x + 30))/2, width: self.view.center.x + 30, height: self.view.center.x + 30) - view.addSubview(borderView!) + //扫描边框 + borderView!.frame = CGRect.init(x: (UIScreen.main.bounds.size.width-(self.view.center.x+30))/2, y: (UIScreen.main.bounds.size.height-(self.view.center.x + 30))/2, width: self.view.center.x + 30, height: self.view.center.x + 30) + view.addSubview(borderView!) - //扫描的线 - scanLineView!.frame = CGRect(x:borderView!.frame.origin.x+2, y: borderView!.frame.origin.y+2, width: borderView!.bounds.size.width, height: 2) - view.addSubview(scanLineView!) + //扫描的线 + scanLineView!.frame = CGRect(x:borderView!.frame.origin.x+2, y: borderView!.frame.origin.y+2, width: borderView!.bounds.size.width, height: 2) + view.addSubview(scanLineView!) - let tipLabel = UILabel(); - tipLabel.text = "对准二维码,即可自动扫描"; - tipLabel.textColor = UIColor.white; - tipLabel.font = UIFont.systemFont(ofSize: 14) - tipLabel.textAlignment = .center; - tipLabel.frame = CGRect(x: 0, y:0, width:200, height: 40) - tipLabel.center = CGPoint(x: borderView!.center.x , y: borderView!.center.y + (self.view.center.x + 30)/2 + 30); - view.addSubview(tipLabel) - } + let tipLabel = UILabel(); + tipLabel.text = "对准二维码,即可自动扫描"; + tipLabel.textColor = UIColor.white; + tipLabel.font = UIFont.systemFont(ofSize: 14) + tipLabel.textAlignment = .center; + tipLabel.frame = CGRect(x: 0, y:0, width:200, height: 40) + tipLabel.center = CGPoint(x: borderView!.center.x , y: borderView!.center.y + (self.view.center.x + 30)/2 + 30); + view.addSubview(tipLabel) + } - //MARK:- 开始扫描动画 - @objc func startAnimation() -> Void { + //MARK:- 开始扫描动画 + @objc func startAnimation() -> Void { - //让约束从顶部开始 - var frame = self.scanLineView!.frame - frame.origin.y = borderView!.frame.origin.y - self.scanLineView!.frame = frame - self.scanLineView!.layoutIfNeeded() + //让约束从顶部开始 + var frame = self.scanLineView!.frame + frame.origin.y = borderView!.frame.origin.y + self.scanLineView!.frame = frame + self.scanLineView!.layoutIfNeeded() - UIView.animate(withDuration: 3.0, animations: { - //改变frame - frame.origin.y = self.borderView!.frame.origin.y+self.borderView!.bounds.size.height - self.scanLineView!.frame = frame - //强制更新界面 - self.scanLineView!.layoutIfNeeded() - }) - } + UIView.animate(withDuration: 3.0, animations: { + //改变frame + frame.origin.y = self.borderView!.frame.origin.y+self.borderView!.bounds.size.height + self.scanLineView!.frame = frame + //强制更新界面 + self.scanLineView!.layoutIfNeeded() + }) + } - func stopAnimation() -> Void { - //让约束从顶部开始 - var frame = self.scanLineView!.frame - frame.origin.y = 64 + topMargin - self.scanLineView!.frame = frame - self.scanLineView!.layoutIfNeeded() - scanTimer?.invalidate() - scanTimer = nil - } + func stopAnimation() -> Void { + //让约束从顶部开始 + var frame = self.scanLineView!.frame + frame.origin.y = 64 + topMargin + self.scanLineView!.frame = frame + self.scanLineView!.layoutIfNeeded() + scanTimer?.invalidate() + scanTimer = nil + } - public override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) + public override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) - //关闭session - if let session = self.session{ - session.stopRunning() - } - } + //关闭session + if let session = self.session{ + session.stopRunning() + } + } - @objc func closeView(){ - if (self.presentationController != nil) { - self.dismiss(animated: true, completion: nil) - }else{ - self.navigationController?.popViewController(animated: true) - } - } + @objc func closeView(){ + if (self.presentationController != nil) { + self.dismiss(animated: true, completion: nil) + }else{ + self.navigationController?.popViewController(animated: true) + } + } - deinit { - scanTimer?.invalidate() - scanTimer = nil - print("scan-----deinit") + deinit { + scanTimer?.invalidate() + scanTimer = nil + print("scan-----deinit") - } + } - //MARK:设置session - func setupCaptureSession() { - self.session = AVCaptureSession() + //MARK:设置session + func setupCaptureSession() { + self.session = AVCaptureSession() - //高质量采集率 - self.session?.sessionPreset = AVCaptureSession.Preset.high - guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return } - //更改这个设置的时候必须先锁定设备,修改完后再解锁,否则崩溃 - do{ - try device.lockForConfiguration() - //设置闪光灯为自动 - device.flashMode = AVCaptureDevice.FlashMode.auto - device.unlockForConfiguration() - }catch{ - print("崩溃") - } - do{ - try self.videoInput = AVCaptureDeviceInput(device: device) - }catch{ - print("崩溃") - } + //高质量采集率 + self.session?.sessionPreset = AVCaptureSession.Preset.high + guard let device = AVCaptureDevice.default(for: AVMediaType.video) else { return } + //更改这个设置的时候必须先锁定设备,修改完后再解锁,否则崩溃 + do{ + try device.lockForConfiguration() + //设置闪光灯为自动 + device.flashMode = AVCaptureDevice.FlashMode.auto + device.unlockForConfiguration() + }catch{ + print("崩溃") + } + do{ + try self.videoInput = AVCaptureDeviceInput(device: device) + }catch{ + print("崩溃") + } - //输入设备 - if let videoInput = self.videoInput { - if self.session?.canAddInput(videoInput) == true { - self.session?.addInput(videoInput) - } - } + //输入设备 + if let videoInput = self.videoInput { + if self.session?.canAddInput(videoInput) == true { + self.session?.addInput(videoInput) + } + } - //添加输出 - if self.session?.canAddOutput(self.metadataOutput) == true{ - self.session?.addOutput(self.metadataOutput) - } + //添加输出 + if self.session?.canAddOutput(self.metadataOutput) == true{ + self.session?.addOutput(self.metadataOutput) + } - self.metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr, - AVMetadataObject.ObjectType.ean13, - AVMetadataObject.ObjectType.ean8, - AVMetadataObject.ObjectType.code128, - AVMetadataObject.ObjectType.code39, - AVMetadataObject.ObjectType.code93] + self.metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr, + AVMetadataObject.ObjectType.ean13, + AVMetadataObject.ObjectType.ean8, + AVMetadataObject.ObjectType.code128, + AVMetadataObject.ObjectType.code39, + AVMetadataObject.ObjectType.code93] - self.metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) + self.metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) - //预览图层 - if let session = self.session { - self.previewLayer = AVCaptureVideoPreviewLayer(session: session) - self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill - self.previewLayer?.frame = CGRect(x: 0, y : 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) - } + //预览图层 + if let session = self.session { + self.previewLayer = AVCaptureVideoPreviewLayer(session: session) + self.previewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill + self.previewLayer?.frame = CGRect(x: 0, y : 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height) + } - if let layer = self.previewLayer { - view.layer.insertSublayer(layer, at: 0) - } - } + if let layer = self.previewLayer { + view.layer.insertSublayer(layer, at: 0) + } + } - public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { - self.session?.stopRunning(); - if (metadataObjects.count >= 1) { - //数组中包含的都是AVMetadataMachineReadableCodeObject 类型的对象,该对象中包含解码后的数据 - let qrObject:AVMetadataMachineReadableCodeObject = metadataObjects.last as! AVMetadataMachineReadableCodeObject; - //拿到扫描内容在这里进行个性化处理 - let result = qrObject.stringValue - clouse?(result ?? "",firstResult) - closeView() - } - } + public func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { + self.session?.stopRunning(); + if (metadataObjects.count >= 1) { + //数组中包含的都是AVMetadataMachineReadableCodeObject 类型的对象,该对象中包含解码后的数据 + let qrObject:AVMetadataMachineReadableCodeObject = metadataObjects.last as! AVMetadataMachineReadableCodeObject; + //拿到扫描内容在这里进行个性化处理 + let result = qrObject.stringValue + clouse?(result ?? "",firstResult) + closeView() + } + } } -- Gitblit v1.7.1