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
.
时,应使用 guard
或 if let
保护强制展开
我正在 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
.
guard
或 if let
保护强制展开