全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

iOS 原生实现扫描二维码和条形码功能限制扫描区域

现在苹果iOS系统已经原生支持了二维码扫描的功能,使用原生来扫描需要导入AVFoundation。

扫描准备

一、获取摄像设备:

device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)

二、创建输入流

do {
  try input = AVCaptureDeviceInput(device: device)
} catch let e as NSError {
  print(e.localizedDescription)
}

三、创建输出流

output = AVCaptureMetadataOutput()
// 设置代理在主线程中刷新
output?.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

四、初始化连接对象

session = AVCaptureSession()
// 高质量采集率
session?.canSetSessionPreset(AVCaptureSessionPresetHigh)
session?.addOutput(output)
session?.addInput(input)

五、设置扫描区域

// 特别注意的地方:有效的扫描区域,定位是以设置的右顶点为原点。屏幕宽所在的那条线为y轴,屏幕高所在的线为x轴
let x = ((SCREENHeight - QRCodeWidth - topViewHeight) / 2.0) / SCREENHeight
let y = ((SCREENWidth - QRCodeWidth) / 2.0) / SCREENWidth
let width = QRCodeWidth / SCREENHeight
let height = QRCodeWidth / SCREENWidth
output?.rectOfInterest = CGRect(x: x, y: y, width: width, height: height)

六、设置扫码支持的编码格式(如下设置条形码和二维码兼容)

output?.metadataObjectTypes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]

七、开始捕获

preview = AVCaptureVideoPreviewLayer(session: session)
preview?.videoGravity = AVLayerVideoGravityResizeAspectFill
preview?.frame = self.view.layer.bounds
self.view.layer.insertSublayer(preview!, at: 0)
session?.startRunning()

扫描动画

这里的动画是仿支付宝的扫描框动画

我们新建一个方法,专门处理我们的动画。

fileprivate func scanAnimation() -> CABasicAnimation {
   let scanNetAnimation = CABasicAnimation()
    // 沿Y轴运动
   scanNetAnimation.keyPath = "transform.translation.y"
   // 扫描框的高度,注意:这里是实际高度的相反数
   scanNetAnimation.byValue = QRCodeWidth
    // 动画的持续时间
   scanNetAnimation.duration = 1.5
   // 动画的重复次数
   scanNetAnimation.repeatCount = MAXFLOAT
   return scanNetAnimation
}

使用动画:

我们在创建界面的时候,扫描框有一个UIImageView,我们需要将我们的动画添加到这个ImageView上面。

scanImageView?.layer.add(scanAnimation(), forKey: nil)

扫描之后的处理

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
  if metadataObjects.count > 0 {
    session?.stopRunning()
    let metadataObject = metadataObjects[0] as AnyObject
    let stringValue: String = metadataObject.stringValue
    let vc = QRCodeResultViewController.instantiate()
    vc.resultStr = stringValue
    self.navigationController?.pushViewController(vc, animated: true)
  }
}

点击扫描结果的处理

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
  let requestURL = request.url
  if requestURL?.scheme == "http" || requestURL?.scheme == "https" || requestURL?.scheme == "mailto" && navigationType == .linkClicked {
//    UIApplication.shared.open(requestURL!, options: [:], completionHandler: nil)
    let svc = SFSafariViewController(url: requestURL!)
    self.present(svc, animated: true, completion: nil)
  }
  return true
}

我们可以用

open func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: ((Bool) -> Swift.Void)? = nil)

在Safari中打开连接。不过最好是把事件控制在自己的程序中,在iOS 9 之后,苹果引入了 SFSafariViewController 这个类,可以用这个类来显示需要浏览的网页。

let svc = SFSafariViewController(url: requestURL!)
self.present(svc, animated: true, completion: nil)

以上所述是小编给大家介绍的iOS 原生实现扫描二维码和条形码功能限制扫描区域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# ios原生条形码扫描  # ios原生二维码扫描  # iOS和Android用同一个二维码实现跳转下载链接的方法  # IOS生成与读取二维码名片  # iOS实现二维码的扫描功能  # ios swift3.0实现二维码扫描、生成、识别示例代码  # IOS笔记061之二维码的生成和扫描  # iOS模仿微信长按识别二维码的多种方式  # iOS 条码及二维码扫描(从相册中读取条形码/二维码)及扫码过程中遇到的坑  # iOS自带原生二维码扫描的实现  # iOS第三方框架二维码生成与扫描  # 可以用  # 小编  # 自己的  # 在此  # 给大家  # 高质量  # 那条  # 所述  # 支付宝  # 给我留言  # 感谢大家  # 新建一个  # 持续时间  # 有一个  # 疑问请  # 有任何  # 点为  # 引入了  # height  # metadataObjectTypes 


相关文章: 如何用PHP工具快速搭建高效网站?  制作销售网站教学视频,销售网站有哪些?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  c# 服务器GC和工作站GC的区别和设置  如何使用Golang安装API文档生成工具_快速生成接口文档  如何获取上海专业网站定制建站电话?  html制作网站的步骤有哪些,iapp如何添加网页?  如何在景安服务器上快速搭建个人网站?  建站之星2.7模板快速切换与批量管理功能操作指南  建站为何优先选择香港服务器?  javascript中对象的定义、使用以及对象和原型链操作小结  高防服务器如何保障网站安全无虞?  建站主机选购指南与交易推荐:核心配置解析  如何在香港免费服务器上快速搭建网站?  建站主机类型有哪些?如何正确选型  沈阳制作网站公司排名,沈阳装饰协会官方网站?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  建站主机选购指南:核心配置与性价比推荐解析  武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?  建站上传速度慢?如何优化加速网站加载效率?  建站主机服务器选购指南:轻量应用与VPS配置解析  宝塔建站助手安装配置与建站模板使用全流程解析  宝塔新建站点为何无法访问?如何排查?  魔方云NAT建站如何实现端口转发?  ,购物网站怎么盈利呢?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  如何快速选择适合个人网站的云服务器配置?  如何快速查询网站的真实建站时间?  建站之星后台管理:高效配置与模板优化提升用户体验  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何在自有机房高效搭建专业网站?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  深入理解Android中的xmlns:tools属性  高性能网站服务器部署指南:稳定运行与安全配置优化方案  无锡营销型网站制作公司,无锡网选车牌流程?  公司门户网站制作流程,华为官网怎么做?  建站之星ASP如何实现CMS高效搭建与安全管理?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  建站之星安装模板失败:服务器环境不兼容?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  实例解析angularjs的filter过滤器  建站之星如何实现PC+手机+微信网站五合一建站?  中山网站推广排名,中山信息港登录入口?  再谈Python中的字符串与字符编码(推荐)  制作门户网站的参考文献在哪,小说网站怎么建立?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。