我在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()
中的代码永远不会执行。
答案 0 :(得分:2)
为什么它不起作用?
添加视图控制器的视图会删除控制器本身,没有人可以实际获取该事件。所以,你得到了视图而不是事件。并支持这个:
实际使用您的代码的解决方案是:
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
保护强制解包。