CodeScanner

Twitter: @twostraws

CodeScanner 是一个 SwiftUI 框架,可以轻松扫描二维码和条形码等代码。它提供了一个视图结构体 CodeScannerView,可以显示在表单中,以便所有扫描都在一个位置进行。

基本用法

您应该创建 CodeScannerView 的一个实例,至少包含两个参数:要扫描的类型数组,以及在结果准备就绪时将调用的闭包。

您的完成闭包必须接受一个 Result<ScanResult, ScanError>,其中成功情况是找到的代码字符串和类型。 例如,如果您要求扫描二维码和条形码,您可能会被告知找到了一个包含电子邮件地址 paul@hackingwithswift.com 的二维码。

如果出现问题,您的结果将包含一个 ScanError,设置为以下三种情况之一

重要提示: iOS 要求 您将“Privacy - Camera Usage Description”键添加到您的 Info.plist 文件中,并提供您想要访问相机的原因。

自定义选项

您可以在 CodeScannerView 的初始化器中提供各种额外的自定义选项

如果您想添加 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

特此授权,免费授予任何人获得本软件和相关文档文件(“软件”)副本的许可,以不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许向获得软件的人员提供软件,但须符合以下条件

上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。

本软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、适用于特定用途和非侵权保证。 在任何情况下,作者或版权持有人均不对任何索赔、损害赔偿或其他责任承担责任,无论是在合同诉讼、侵权诉讼或其他诉讼中,因软件或软件的使用或其他交易引起、出于或与软件或软件的使用或其他交易有关。