CodeScanner 是一个 SwiftUI 框架,可以轻松扫描二维码和条形码等代码。它提供了一个视图结构体 CodeScannerView
,可以显示在表单中,以便所有扫描都在一个位置进行。
您应该创建 CodeScannerView
的一个实例,至少包含两个参数:要扫描的类型数组,以及在结果准备就绪时将调用的闭包。
您的完成闭包必须接受一个 Result<ScanResult, ScanError>
,其中成功情况是找到的代码字符串和类型。 例如,如果您要求扫描二维码和条形码,您可能会被告知找到了一个包含电子邮件地址 paul@hackingwithswift.com 的二维码。
如果出现问题,您的结果将包含一个 ScanError
,设置为以下三种情况之一
badInput
,如果无法访问相机badOutput
,如果相机无法检测代码initError
,如果初始化失败。重要提示: iOS 要求 您将“Privacy - Camera Usage Description”键添加到您的 Info.plist 文件中,并提供您想要访问相机的原因。
您可以在 CodeScannerView
的初始化器中提供各种额外的自定义选项
scanMode
可以是 .once
(扫描单个代码)、.oncePerCode
(扫描多个代码,但每个唯一代码仅触发一次)和 .continuous
(持续查找代码,直到您关闭扫描器)。默认值:.once
。scanInterval
控制在 .continuous
扫描模式下,单个代码应该被扫描的速度(以秒为单位)。showViewfinder
确定是否在 UI 上显示类似框的取景器。默认值:false。simulatedData
允许您提供一些测试数据,以便在模拟器中使用,当真实扫描不可用时。默认值:空字符串。shouldVibrateOnSuccess
允许您确定在找到代码时设备是否应该震动。默认值:true。videoCaptureDevice
允许您选择最适合扫描代码的不同捕获设备。如果您想添加 UI 自定义,例如专用的“取消”按钮,您应该将您的 CodeScannerView
实例包装在 NavigationView
中,并使用 toolbar()
修饰符来添加您想要的任何按钮。
这是一个创建 QR 码扫描视图的示例代码,该视图打印找到的代码或任何错误。 如果它在模拟器中使用,它将返回一个名称,因为这是作为模拟数据提供的
CodeScannerView(codeTypes: [.qr], simulatedData: "Paul Hudson") { response in
switch response {
case .success(let result):
print("Found code: \(result.string)")
case .failure(let error):
print(error.localizedDescription)
}
}
您的完成闭包可能是您想要关闭 CodeScannerView
的地方。
这是一个关于如何将 QR 码扫描视图作为表单呈现,以及如何将扫描的条形码传递到 NavigationView
中的下一个视图的示例
struct QRCodeScannerExampleView: View {
@State private var isPresentingScanner = false
@State private var scannedCode: String?
var body: some View {
VStack(spacing: 10) {
if let code = scannedCode {
NavigationLink("Next page", destination: NextView(scannedCode: code), isActive: .constant(true)).hidden()
}
Button("Scan Code") {
isPresentingScanner = true
}
Text("Scan a QR code to begin")
}
.sheet(isPresented: $isPresentingScanner) {
CodeScannerView(codeTypes: [.qr]) { response in
if case let .success(result) = response {
scannedCode = result.string
isPresentingScanner = false
}
}
}
}
}
由于双摄像头或三摄像头内置的最小对焦距离,在配备双摄像头或三摄像头的设备上扫描小型二维码必须进行调整。 为了在扫描的代码上获得最佳对焦效果,需要选择最合适的摄像头并应用推荐的变焦系数。
扫描 20x20mm 二维码的示例。
CodeScannerView(codeTypes: [.qr], videoCaptureDevice: AVCaptureDevice.zoomedCameraForQRCode(withMinimumCodeSize: 20)) { response in
switch response {
case .success(let result):
print("Found code: \(result.string)")
case .failure(let error):
print(error.localizedDescription)
}
}
CodeScanner 由 Paul Hudson 制作,他撰写了 Hacking with Swift 上的免费 Swift 教程,现在由 Nathan Fallet 维护。 它在 MIT 许可证下可用,该许可证允许商业用途、修改、分发和私人用途。
MIT 许可证。
版权所有 (c) 2021 Paul Hudson
特此授权,免费授予任何人获得本软件和相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向获得软件的人员提供软件,但须符合以下条件
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、适用于特定用途和非侵权保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害赔偿或其他责任承担责任,无论是在合同诉讼、侵权诉讼或其他诉讼中,因软件或软件的使用或其他交易引起、出于或与软件或软件的使用或其他交易有关。