Пользовательская кнопка затвора в 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,

Другие вопросы по тегам