iOS swift5 扫描二维码
文章目录
- 1.生成二维码图片
- 2.扫描二维码(含上下扫描动画)
- 2.1 记得在info.plist中添加相机权限描述
1.生成二维码图片

import UIKit
import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data = string.data(using: String.Encoding.utf8)if let filter = CIFilter(name: "CIQRCodeGenerator") {filter.setValue(data, forKey: "inputMessage")let transform = CGAffineTransform(scaleX: 3, y: 3)if let output = filter.outputImage?.transformed(by: transform) {return UIImage(ciImage: output)}}return nil
}class SendVC: UIViewController {override func viewDidLoad() {super.viewDidLoad()title = "旧机发送"view.backgroundColor = .whiteaddImageView()}func addImageView() {let imageView = UIImageView()view.addSubview(imageView)imageView.snp.makeConstraints { make inmake.center.equalToSuperview()make.width.height.equalTo(200)}imageView.image = generateQRCode(from: "123")}
}
2.扫描二维码(含上下扫描动画)

2.1 记得在info.plist中添加相机权限描述
- 在使用下面的代码之前,确保你的 Info.plist 文件中已添加了相机权限描述(Camera Usage Description)。
<key>NSCameraUsageDescription</key>
<string>We need access to your camera for QR code scanning.</string>
import AVFoundation
import UIKitclass QRCodeScannerViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {var captureSession: AVCaptureSession!var previewLayer: AVCaptureVideoPreviewLayer!override func viewDidLoad() {super.viewDidLoad()// 设置 AVCaptureSessioncaptureSession = AVCaptureSession()guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }let videoInput: AVCaptureDeviceInputdo {videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)} catch {return}if captureSession.canAddInput(videoInput) {captureSession.addInput(videoInput)} else {return}let metadataOutput = AVCaptureMetadataOutput()if captureSession.canAddOutput(metadataOutput) {captureSession.addOutput(metadataOutput)metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)metadataOutput.metadataObjectTypes = [.qr]} else {return}// 设置预览图层previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)previewLayer.frame = view.layer.boundspreviewLayer.videoGravity = .resizeAspectFillview.layer.addSublayer(previewLayer)// 开始扫描captureSession.startRunning()addMaskToScannerView()}var scanningLine: UIView!func addMaskToScannerView() {// 计算正方形的位置,使其位于视图的正中心let squareSize: CGFloat = 300let squareX = (view.bounds.width - squareSize) / 2let squareY = (view.bounds.height - squareSize) / 2// 创建四个半透明的 UIView 元素作为遮罩let topMask = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: squareY))let bottomMask = UIView(frame: CGRect(x: 0, y: squareY + squareSize, width: view.bounds.width, height: view.bounds.height - (squareY + squareSize)))let leftMask = UIView(frame: CGRect(x: 0, y: squareY, width: squareX, height: squareSize))let rightMask = UIView(frame: CGRect(x: squareX + squareSize, y: squareY, width: view.bounds.width - (squareX + squareSize), height: squareSize))// 设置遮罩的背景颜色[topMask, bottomMask, leftMask, rightMask].forEach {$0.backgroundColor = UIColor.black.withAlphaComponent(0.6)view.addSubview($0)}// 添加绿色的正方形框let squareFrame = UIView(frame: CGRect(x: squareX, y: squareY, width: squareSize, height: squareSize))squareFrame.layer.borderColor = UIColor.green.cgColorsquareFrame.layer.borderWidth = 3squareFrame.backgroundColor = .clearview.addSubview(squareFrame)// 添加扫描线scanningLine = UIView(frame: CGRect(x: squareX, y: squareY, width: squareSize, height: 2))scanningLine.backgroundColor = UIColor.redview.addSubview(scanningLine)// 扫描线动画let animation = CABasicAnimation(keyPath: "position.y")animation.fromValue = squareYanimation.toValue = squareY + squareSizeanimation.duration = 2animation.repeatCount = .infinityscanningLine.layer.add(animation, forKey: "scanning")}// 当扫描到 QRCode 时,此方法将被调用func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {captureSession.stopRunning()if let metadataObject = metadataObjects.first {guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else { return }guard let stringValue = readableObject.stringValue else { return }AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))found(code: stringValue)}dismiss(animated: true)}func found(code: String) {print("QRCode: \(code)")// 在此处处理扫描到的 QRCode}// 其他代码,如视图将要消失时停止扫描等
}相关文章:
iOS swift5 扫描二维码
文章目录 1.生成二维码图片2.扫描二维码(含上下扫描动画)2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…...
【马拉车算法/动态规划】最长回文字串
最长回文字串 1.问题描述2.中心扩展法(O(N^2))3.动态规划4.Manacher(马拉车算法) 1.问题描述 常用有3种算法:中心扩展法、动态规划和Manacher算法 2.中心扩展法(O(N^2)) 解释: 从中心向外扩展。 分为两种…...
什么是 fail-fast? 什么是fail-safe?
面试回答 在系统设计中,快速失效(fail-fast)系统一种可以立即报告任何可能表明故障的情况的系统。快速失效系统通常设计用于停止正常操作,而不是试图继续可能存在缺陷的过程。 其实,这是一种理念,说白了就是…...
第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)
第三届计算机、物联网与控制工程国际学术会议(CITCE 2023) The 3rd International Conference on Computer, Internet of Things and Control Engineering(CITCE 2023) 第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)…...
react antd 日期选择 WeekPicker MonthPicker 取值转为起止日期
默认WeekPicker 取值,返回的是2023年34周,这样后台用起来不方便。可以转化成指定周的起止日期 const startDate moment(weekData).day(1).format(YYYY-MM-DD); // 周一日期 const endDate moment(weekData).day(7).format(YYYY-MM-DD); // 周日日期同…...
table,设置 数据相同时, 合并列
<el-table :data"tableData" :span-method"objectSpanMethod" border style"width: 100%" show-summary><el-table-column type"index" label"序号" width"100" /><el-table-column prop"dat…...
kotlin如何接收前端传递过来的数据
Kotlin 可以使用 Spring Boot 等框架来接收前端传递过来的数据。 在 Spring Boot 中,你可以使用 RequestBody 注解来将前端传递的 JSON 格式数据转换为相应的 Kotlin 对象。 示例代码: RestController RequestMapping("/api") class UserCo…...
《中国区块链发展报告(2023)》发布 和数集团推动区块链发展
北京区块链技术应用协会与社会科学文献出版社日前在京共同发布《区块链蓝皮书:中国区块链发展报告(2023)》。蓝皮书归纳梳理了2022年区块链产业发展现状及趋势,并结合行业热点Web3.0、AIGC,探讨我国区块链发展的热点话…...
FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置
FreeSWITCH 1.10.10 简单图形化界面3 - 阿里云NAT设置 0、 界面预览1、 查看IP地址2、 修改协议配置3、 开放阿里云安全组4、 设置ACL5、 设置协议中ACL,让PBX匹配内外网6、 重新加载SIP模块7、 查看状态8、 测试一下 0、 界面预览 http://myfs.f3322.net:8020/ 用…...
Android SDK 上手指南||第五章 用户界面设计
第五章 用户界面设计 在本篇教程中我们将为应用程序项目添加布局方案,在这方面XML与Eclipse ADT接口将成为工作中的得力助手——不过在后面两节中还会用到一部分Java开发知识。XML与Java在Android平台的开发工作当中可谓无处不在,如果大家对二者还缺乏基…...
std::list和std::vector删除指定下标的元素
list和vector都可以使用erase函数移除指定下标的元素,注意输入的是迭代器,返回值为指向下一个元素的位置。: iterator erase(iterator position); iterator erase(iterator first,iterator last); 如果下标是index,直接调用即可:…...
Apache POI 以及 导出Excel表
一、Apache POI 1、介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。 2、Apache POI 怎么…...
RabbitMQ从原理到实战—基于Golang【万字详解】
文章目录 前言一、MQ是什么?优势劣势 二、MQ的用途1、应用解耦2、异步加速3、削峰填谷4、消息分发 三、RabbitMQ是什么1、AMQP 协议2、RabbitMQ 包含的要素3、RabbitMQ 基础架构 四、实战1、Simple模式(即最简单的收发模式)2、Work Queues 模型3、Publish/Subscribe…...
机器学习——KNN算法
1、:前提知识 KNN算法是机器学习算法中用于分类或者回归的算法,KNN全称为K nearest neighbour(又称为K-近邻算法) 原理:K-近邻算法采用测量不同特征值之间的距离的方法进行分类。 优点:精度高 缺点&…...
Kali 软件管理测试案例
案例1 :显示目录树 tree ┌──(root㉿kali)-[~] └─# tree --help usage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF][-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore][--gitfile[]file] [--matchdirs] [--metafirs…...
【分布式】Zookeeper
Java开发者视角下的Zookeeper—— 在什么场景下使用,怎么用 可以参考:https://zhuanlan.zhihu.com/p/62526102 Zookeeper是什么? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务。ZooKeeper 的设计目标是将那些复…...
ScheduleJS Crack,新的“信息列”水平滚动功能
ScheduleJS Crack,新的“信息列”水平滚动功能 增加了对Angular 16的支持 新的“信息列”水平滚动功能。 新的“信息列”固定功能。 添加了输入属性以处理组件模板中的偶数和奇数ScheduleRowPlainBackgroundColor以及CSS变量。 改进了“信息列”和角度甘特组件的类型。 Schedul…...
curl封装
一。由于工作的原因,需要对curl做一些封装,附加上我们的证书,提供给第三个C和jAVA使用。 二。头文件封闭四个函数,get,post,download,upload #ifndef CURLHTTP_H #define CURLHTTP_H#include …...
C语言数据类型和变量
C语言数据类型和变量 数据类型分类内置类型【C语言本身就具有的类型】自定义类型【自己来创建类型】取值范围 变量变量的创建变量创建的语法形式变量的分类全局变量局部变量 栈区、堆区、静态区 算术操作符赋值操作符连续赋值复合赋值符 单目操作符:、--、、-强制类…...
分布式训练 最小化部署docker swarm + docker-compose落地方案
目录 背景: 前提条件: 一、docker环境初始化配置 1. 安装nvidia-docker2 2. 安装docker-compose工具 3. 获取GPU UUID 4. 修改docker runtime为nvidia,指定机器的UUID 二、docker-swarm 环境安装 1. 初始化swarm管理节点 2. 加入工…...
QWen 3.5plus总结的总结基准测试结果的正确方法
原文地址:https://dl.acm.org/doi/epdf/10.1145/5666.5673 如何用统计撒谎:总结基准测试结果的正确方法 作者:PHILIP J. FLEMING 和 JOHN J. WALLACE 在文献中,性能结果经常使用性能比率的算术平均值来总结,在某些情况…...
JAVA集成CAS客户端总结
一、依赖<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-support-springboot</artifactId><version>3.6.4</version></dependency>二、yml配置cas:server-url-prefix: https://xxx.xxx:8443/cas…...
EdgeRemover:Windows Edge浏览器彻底卸载的智能方案 - 释放系统资源新方法
EdgeRemover:Windows Edge浏览器彻底卸载的智能方案 - 释放系统资源新方法 【免费下载链接】EdgeRemover PowerShell script to remove Microsoft Edge in a non-forceful manner. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 核心价值定位 用…...
《奇迹 MU:荣耀出征》荣耀 12 区:职业选择 + 开荒路线 + 搬砖技巧全攻略!
作为正版奇迹 MU 授权的复古魔幻手游,《奇迹 MU:荣耀出征》的核心魅力不仅在于经典职业的热血回归与自由交易的搬砖乐趣,更在于从新手开荒到高阶攻坚的完整成长链路、全阶段高爆地图的刷宝惊喜、世界 BOSS 的全服混战与战盟攻城的巅峰对决。相…...
ANIMATEDIFF PRO新手避坑指南:常见问题与解决方案全解析
ANIMATEDIFF PRO新手避坑指南:常见问题与解决方案全解析 1. 前言:为什么选择ANIMATEDIFF PRO 如果你正在寻找一款能够生成电影级质量AI视频的工具,ANIMATEDIFF PRO可能是目前最强大的选择之一。基于AnimateDiff架构和Realistic Vision V5.1…...
python-flask-djangol框架的现代化动物园观光游览系统
目录技术选型与架构设计核心功能模块实现票务与游客管理智能化服务集成性能优化与测试部署与监控项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术选型与架构设计 采用Python的Flask或Django框架构建后端系统,具…...
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告 1. DeerFlow简介:您的智能研究助手 DeerFlow是一款由字节跳动开源的深度研究自动化工具,它整合了语言模型、网络搜索和代码执行能力,能够快速完成复杂的研究任务。这个工具…...
ESLyric歌词源一站式配置:Foobar2000多平台格式转换高效解决方案
ESLyric歌词源一站式配置:Foobar2000多平台格式转换高效解决方案 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource ESLyric歌词源是Foobar2000播…...
突破透明动画性能瓶颈:VAP引擎实现移动端高效视觉体验
突破透明动画性能瓶颈:VAP引擎实现移动端高效视觉体验 【免费下载链接】vap VAP是企鹅电竞开发,用于播放特效动画的实现方案。具有高压缩率、硬件解码等优点。同时支持 iOS,Android,Web 平台。 项目地址: https://gitcode.com/gh_mirrors/va/vap …...
GF-1遥感影像水体提取实战:Unet++、Deeplabv3+、MANet模型对比与避坑指南
GF-1遥感影像水体提取实战:三大模型对比与避坑全攻略 当国产高分一号(GF-1)卫星数据遇上深度学习语义分割技术,水体提取这项传统遥感任务正在经历革命性变革。本文将带您深入Unet、Deeplabv3和MANet三大主流模型在GF-1影像上的实战…...
