1

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

let image = UIImagePickerController()

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

@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()永远不会执行。

4

1 回答 1

3

为什么它真的不起作用?

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

在此处输入图像描述

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

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 let在转换为UIView.

于 2018-03-30T09:07:53.227 回答