Swift: 无法检测线性条形码
Swift: Unable to detect linear type Barcodes
我正在编写条码 reader 应用程序,但我无法检测线性条码,即代码 128。我对二维码、EAN13 类型和 ISBN 类型没有任何问题。我的代码非常简单:
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count != 0 {
if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
if object.type == AVMetadataObject.ObjectType.qr {
if let text = object.stringValue {
print(text)
session.stopRunning()
let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: UIAlertControllerStyle.alert)
alertVC.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
self.session.startRunning()
}))
present(alertVC, animated: true, completion: nil)
}
} else {
if let text = object.stringValue {
print("Other code detected: ", text)
}
}
}
}
我使用 this 免费的在线条形码生成器来测试我的应用程序。我能够检测大多数其他条形码,线性代码除外。有没有人也遇到过这样的问题?
确保在设置 AVCaptureMetadataOutput
对象类型时包括 AVMetadataObjectTypeCode128Code [.code128]
metadataObjectTypes
。
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
如果您想允许所有可用的元数据对象类型,您可以使用 AVCaptureMetadataOutput
属性 availableMetadataObjectTypes
其中 return 所有可用类型:
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
如果您想允许除第一个面之外的所有内容,您可以删除可用元数据对象类型的第一个元素。请注意,Apple 可能会在不久的将来更改元数据元素顺序,因此最好仅手动 select 您的应用所需的条形码类型:
metadataOutput.metadataObjectTypes = Array(metadataOutput.availableMetadataObjectTypes.dropFirst())
只是对您的实际代码的一些注释。您不应该检查元素计数是否等于零来检查它是否为空。 Array 有一个名为 isEmpty 的 属性 正好对应 if !metadataObjects.isEmpty { //...
。另一种选择是,如果只使用数组的第一个元素,我建议使用数组 .first
而不是下标 [0]
,其中 return 是一个可选元素 AVMetadataObject?
和 AVMetadataObject.ObjectType
在你的比较中是多余的:
if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject {
if object.type == .qr {
if let text = object.stringValue {
print(text)
session.stopRunning()
let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: .alert)
alertVC.addAction(UIAlertAction(title: "Ok", style: .default) { _ in
self.session.startRunning()
})
present(alertVC, animated: true)
}
}
else
if let text = object.stringValue {
print("Other code detected: ", text)
}
}
我正在编写条码 reader 应用程序,但我无法检测线性条码,即代码 128。我对二维码、EAN13 类型和 ISBN 类型没有任何问题。我的代码非常简单:
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects.count != 0 {
if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
if object.type == AVMetadataObject.ObjectType.qr {
if let text = object.stringValue {
print(text)
session.stopRunning()
let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: UIAlertControllerStyle.alert)
alertVC.addAction(UIAlertAction(title: "Ok", style: .default, handler: { (action) in
self.session.startRunning()
}))
present(alertVC, animated: true, completion: nil)
}
} else {
if let text = object.stringValue {
print("Other code detected: ", text)
}
}
}
}
我使用 this 免费的在线条形码生成器来测试我的应用程序。我能够检测大多数其他条形码,线性代码除外。有没有人也遇到过这样的问题?
确保在设置 AVCaptureMetadataOutput
对象类型时包括 AVMetadataObjectTypeCode128Code [.code128]
metadataObjectTypes
。
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128]
如果您想允许所有可用的元数据对象类型,您可以使用 AVCaptureMetadataOutput
属性 availableMetadataObjectTypes
其中 return 所有可用类型:
metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
如果您想允许除第一个面之外的所有内容,您可以删除可用元数据对象类型的第一个元素。请注意,Apple 可能会在不久的将来更改元数据元素顺序,因此最好仅手动 select 您的应用所需的条形码类型:
metadataOutput.metadataObjectTypes = Array(metadataOutput.availableMetadataObjectTypes.dropFirst())
只是对您的实际代码的一些注释。您不应该检查元素计数是否等于零来检查它是否为空。 Array 有一个名为 isEmpty 的 属性 正好对应 if !metadataObjects.isEmpty { //...
。另一种选择是,如果只使用数组的第一个元素,我建议使用数组 .first
而不是下标 [0]
,其中 return 是一个可选元素 AVMetadataObject?
和 AVMetadataObject.ObjectType
在你的比较中是多余的:
if let object = metadataObjects.first as? AVMetadataMachineReadableCodeObject {
if object.type == .qr {
if let text = object.stringValue {
print(text)
session.stopRunning()
let alertVC = UIAlertController(title: "QR Code", message: text, preferredStyle: .alert)
alertVC.addAction(UIAlertAction(title: "Ok", style: .default) { _ in
self.session.startRunning()
})
present(alertVC, animated: true)
}
}
else
if let text = object.stringValue {
print("Other code detected: ", text)
}
}