cameraOverlayView 中的自定义快门按钮未执行

Custom shutter button in cameraOverlayView not executing

我正在 Swift 制作自定义相机。我这样声明它是全局的:

let image = UIImagePickerController()

我在IB中取得了OverlayVC (UIViewController)。制作了一个快门按钮并像这样连接它:

@IBAction func shutterTapped(_ sender: Any) {
    print("shutterTapped")
    image.takePicture()
}

我在展示之前实例化了这个叠加层:

image.delegate = self
image.sourceType = .camera
image.cameraDevice = .front
image.allowsEditing = false
let overlay = self.storyboard?.instantiateViewController(withIdentifier: "OverlayVC")
image.cameraOverlayView = overlay?.view
image.showsCameraControls = false
self.present(image, animated: true, completion: nil)

现在,当我 运行 在设备上构建并点击快门按钮时,我可以直观地看到它被点击(淡化 out/in)但是 [= 中的代码14=] 从不执行。

为什么它没有真正起作用?

添加视图控制器的视图会删除控制器本身,没有人能真正获得该事件。所以,你得到的是视图而不是事件。并支持这一点:

实际适用于您的代码的解决方案是:

image.cameraOverlayView = overlay?.view
if let viewController  = overlay {

    for view in viewController.view.subviews {
        if let button = view as? UIButton {
           button.addTarget(self, action: #selector(self.takePicture), for: UIControlEvents.touchDown)
        }
    }
}

你也可以给它添加标签,这样你就可以检查哪个按钮是哪个,如果你有更多的话。

备选方案:

为其创建UIView 子类和xib。您在 OverlayVC 中的观点相同。然后,在添加覆盖时使用以下内容:

image.sourceType = .camera
image.cameraDevice = .front
image.allowsEditing = false
let myOverlay = Bundle.main.loadNibNamed("CameraOverlay", owner: self, options: nil)
image.cameraOverlayView = myOverlay?.first as! UIView
image.showsCameraControls = false
self.present(image, animated: true, completion: nil)

请注意,在转换为 UIView.

时,应使用 guardif let 保护强制展开