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

时间:2018-03-25 15:11:07

标签: swift uiimagepickercontroller cameraoverlayview

我在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)

现在,当我在设备上运行构建并点击快门按钮时,我可以直观地看到它被点击(淡出/淡入),但 shutterTapped() 中的代码永远不会执行。

1 个答案:

答案 0 :(得分:2)

为什么它不起作用?

添加视图控制器的视图会删除控制器本身,没有人可以实际获取该事件。所以,你得到了视图而不是事件。并支持这个:

enter image description here

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

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)

请注意,在转换为guard时,应使用if letUIView保护强制解包。