Search code examples
swiftxcodeuiimageviewuiimagepickercontrolleruitapgesturerecognizer

Swift - get sender of UIImagePickerController


I have 2 UIImageViews which I have added a UITapGestureRecognizer to which opens the user's camera. Once the user has selected an image, then the UIImageView that was tapped in order to access the camera should be set with the camera image.

So here is my openCamera method:

   @objc func openCamera(sender: ImagePlaceHolderView) {
       let picker = UIImagePickerController()
        picker.allowsEditing = true
        picker.delegate = self
        picker.sourceType = .camera 
        present(picker, animated: true)
    }

My UIImageViews are declared as follows:

var left = UIImageView()
var right = UIImageView()
left = createImagePlaceholder()
right = createImagePlaceholder()

private func createImagePlaceholder() -> UIImageView {
    let placeholder = ImagePlaceHolderView(frame: CGRect(x: 0, y: 0, width: 90, height: 150))
    placeholder.isUserInteractionEnabled = true
    return placeholder
}

And then my delegate method:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let image = info[.editedImage] as? UIImage else { return }
    left.image = image  // Here I want to set the sender's image to image
    dismiss(animated: true, completion: nil)
}

I'm struggling to figure out how to set the image of the UIImageView that was tapped to this new image from the camera. I'm trying to pass the sender into the openCamera method but not sure how to extract this, as the sender seems in fact to be the UITapGestureRecognizer rather than the image that was tapped.


Solution

  • You'll have to store a reference to the sender and use that to set the image in the delegate method.

    var imagePlaceholderView: ImagePlaceHolderView? // set the reference
    
    @objc func openCamera(sender: UITapGestureRecognizer) {
        imagePlaceholderView = sender.view as? ImagePlaceHolderView
        //...
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        guard let image = info[.editedImage] as? UIImage else { return }
        imagePlaceholderView?.image = image
        dismiss(animated: true, completion: nil)
    }