Swift 4 上的条形码

2023-11-26

我正在尝试将 mi 应用程序升级到 swift 4,但条形码读取器无法工作。

我已经隔离了条形码读取器代码,但仍然无法工作。相机可以工作,但无法检测到条形码。

该代码在 swift 3 iOS 10 上运行得很好。

这是完整的代码

import AVFoundation
import UIKit

class ViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor.black
    captureSession = AVCaptureSession()

    let videoCaptureDevice = AVCaptureDevice.default(for: AVMediaType.video)
    let videoInput: AVCaptureDeviceInput

    do {
        videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice!)
    } catch {
        return
    }

    if (captureSession.canAddInput(videoInput)) {
        captureSession.addInput(videoInput)
    } else {
        failed();
        return;
    }

    let metadataOutput = AVCaptureMetadataOutput()

    if (captureSession.canAddOutput(metadataOutput)) {
        captureSession.addOutput(metadataOutput)

        metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        metadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.ean8, AVMetadataObject.ObjectType.ean13, AVMetadataObject.ObjectType.pdf417]
    } else {
        failed()
        return
    }

    previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
    previewLayer.frame = view.layer.bounds;
    previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill;
    view.layer.addSublayer(previewLayer);

    captureSession.startRunning();
}

func failed() {
    let ac = UIAlertController(title: "Scanning not supported", message: "Your device does not support scanning a code from an item. Please use a device with a camera.", preferredStyle: .alert)
    ac.addAction(UIAlertAction(title: "OK", style: .default))
    present(ac, animated: true)
    captureSession = nil
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if (captureSession?.isRunning == false) {
        captureSession.startRunning();
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    if (captureSession?.isRunning == true) {
        captureSession.stopRunning();
    }
}

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) {
    captureSession.stopRunning()

    if let metadataObject = metadataObjects.first {
        let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        found(code: readableObject.stringValue!);
    }

    dismiss(animated: true)
}

func found(code: String) {
    print(code)
}

override var prefersStatusBarHidden: Bool {
    return true
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    return .portrait
}
}

我在 iPhone 上使用 iOS 11,已升级至 beta 9。

任何想法?谢谢。


我明白了,但苹果并没有说得那么明显。委托 AVCaptureMetadataOutputObjectsDelegate 的回调函数已重命名,并且参数名称不同!

所以,更换

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!)

to

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection)

此后,我的视图控制器现在像以前一样扫描二维码。它具有相同的参数,但第一个参数名称不同。更改函数和参数名称并构建/运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 4 上的条形码 的相关文章

随机推荐

  • 在自定义视图/uiview子类上实现iphone的复制/粘贴控件

    我承认 在 S O 上已经有一个完全符合这些思路的问题 但它缺乏实现细节 有效的答案 而且我想更具体 所以我认为应该提出一个新问题 显然 如果我错了 请告诉我 我们可以尝试重新启动那里的线程 基本上 当用户按住标签时 我想将 UILabel
  • 通过 HTTPS 使用 Web 服务时抛出 System.Net.WebException

    当使用 HTTPS 调用服务器上运行的 Web 服务时 我的应用程序抛出 System Net WebException 并显示消息 底层连接已关闭 无法与远程服务器建立信任关系 我不确定如何解决此问题并成功拨打电话 经过一番研究 我发现了
  • gcc: printf 和 long double 会导致错误的输出。 [C - 类型转换混乱]

    我对 C 相当陌生 我尝试为 Vector 编写函数 但一定有问题 这是代码 Defines maths for particles include
  • 使用ant或Eclipse编译时出现多个dex文件错误

    我无法构建我的应用程序 我正在运行今天下载的最新构建工具 这种情况在更新后开始发生 dex dex Converting compiled files and external libraries into Users rob Repos
  • 查看 Maven 工件上的 PGP 签名

    我想手动验证来自 Central 的 Maven 工件上的 PGP 签名 但我不知道从哪里开始 我在 Apache 上看到将工件上传到中央存储库的指南它说 我们要求您为所有工件提供 PGP 签名 我看到 Sonatype 的 Nexus P
  • Xamarin - 将命令绑定到用户控件内对象的属性

    几天前我开始学习 XAML 但我很难解决这个问题 在 Xamarin Forms 中 我想创建一个用户控件 其中包含一个标签和一个按钮 并且能够从使用我的用户控件的另一个页面将命令绑定到 XAML 中的用户控件 我目前遇到异常 Xamari
  • 在 ng-repeat 期间添加引导行

    我有一种情况 我有一个要在各个面板中显示的数据列表 使用 Bootstrap 的网格系统 我想利用宽屏幕并水平显示多个面板 但在窄屏幕上让它们堆叠 我目前正在使用这样的 ejs 在服务器端布局 列作为查询参数传入 通常设置为 2 或 3 因
  • Map的keySet()和entrySet()的性能考虑

    All 谁能告诉我两者之间的性能问题到底是什么 网站 代码牧场简要概述了使用 keySet 和 get 时所需的内部调用 但如果任何人都可以提供有关使用 keySet 和 get 方法时流程的准确详细信息 那就太好了 这将帮助我更好地理解性
  • 导致此异常的原因 java.lang.RuntimeException: java.lang.NoSuchMethodException: [class android.view.View]

    我的方法有问题firebase项目 我按照以下步骤操作firebaseGitHub 文档 但我遇到了这个异常 java lang RuntimeException java lang NoSuchMethodException
  • 用于 GADT 的 makeLenses (Haskell)

    是否有相当于makeLenses对于 GADT 如果我有一个简单的GADT like data D a b where D Ord a Ord b gt a gt b gt D a b 有没有办法通过传入构造函数和字段名称列表来自动生成镜头
  • Interface Builder 中 UIButton 的活力效果

    我的一个视图控制器中有一些模糊且充满活力的视觉效果视图 我的标签可以正常工作 充满活力 但每次我尝试向视图添加 UIButton 时 文本似乎是透明的 并且按钮的背景似乎有活力 我正在寻找 编辑 按钮在通知中心的效果 我附上了一些照片供参考
  • Facebook 登录注销在尝试再次登录时出现无效密钥哈希错误

    我有一个简单的 Facebook 登录 注销活动 运行成功 然而 在我从应用程序注销后 我尝试再次登录 但 facebook 给出了无效的密钥哈希错误 请注意 我第一次登录并注销成功 但在我注销并尝试再次登录后 Facebook 给出了该错
  • jQuery 滚动到 Div

    我正在制作一个常见问题解答页面 顶部有按钮可以跳转到某个类别 它会跳转到p我用作类别标签的标签 例如 p 对于我的一般类别 我不想直接跳到类别 而是想添加滚动效果 我想要类似的东西http www dynamicdrive com dyna
  • Dplyr summarise_each 聚合结果

    我有一个这样的数据框 metric1 metric2 metric3 field1 field2 1 1 07809668 4 2569882 7 1710095 L S1 2 0 56174763 1 2660273 0 3751915
  • 使用 python 和 eyes3 创建新的 ID3 标签

    我有一堆根本没有 ID3 标签的 mp3 文件 我正在尝试使用 eyed3 向文件添加 ID3 标签 但不知道使用什么方法 这是我的代码 import eyed3 file eyed3 load test mp3 file tag arti
  • Android - Activity 构造函数与 onCreate

    据我了解 安卓Activities有特定的生命周期onCreate应该被覆盖并用于初始化 但是构造函数中到底发生了什么 是否存在您可以 应该覆盖的情况Activity构造函数也是如此 或者你永远不应该碰它 我假设构造函数永远不应该被使用 因
  • Socket Java 客户端 - Python 服务器

    我正在尝试实现一个 java python 客户端 服务器套接字 客户端是java写的 服务端是python写的 Java客户端 import java io import java net import java lang public
  • AS3:定义命中区域

    我有一个包含位图的影片剪辑 我不想增加命中区域 我知道我可以在它后面添加一个透明形状 但这将通过 ios 的空气进行编译 我不想导致不必要的重绘 有没有办法将矩形定义为点击区域或其他解决方案 有一个特殊的 hitArea 字段用于此目的 c
  • ASP.net 通过内容页访问母版页变量

    我有一个母版页 然后我有一个公共变量 public partial class AdminMaster System Web UI MasterPage protected bool blnShowDialogue false In my
  • Swift 4 上的条形码

    我正在尝试将 mi 应用程序升级到 swift 4 但条形码读取器无法工作 我已经隔离了条形码读取器代码 但仍然无法工作 相机可以工作 但无法检测到条形码 该代码在 swift 3 iOS 10 上运行得很好 这是完整的代码 import