Пользовательская кнопка затвора в cameraOverlayView не выполняется
Я делаю нестандартную камеру в 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()
никогда не выполняет.
1 ответ
Почему это на самом деле не работает?
Добавление представления контроллера представления удаляет сам контроллер, и никто не может фактически получить событие. Итак, вы получаете представление, но не события. и поддержать это:
Решение, которое действительно будет работать с вашим кодом, будет:
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
,