检查按下了哪个 gestureRecognizer

Checking which gestureRecognizer was pressed

我使用 gestureRecognizerUIImageView。我有两个 UIImageView。我需要在 UIImageView 中上传图片。为了打开 UIImagePickerController(),我在两个 UIImageView 上都使用 gestureRecognizer

所以我需要在 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

中以不同的 UIImageView 上传图片

如何从库中上传图片?

这是我的代码:

@IBOutlet weak var mainPhotoImageView: UIImageView!
@IBOutlet weak var addImageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    configureGestureRecognizer()

}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let chosenImage = info[UIImagePickerControllerEditedImage] as? UIImage
    if chosenImage != nil {
        logoImageView.image = chosenImage
        dismiss(animated: true, completion: nil)
    }
}

@objc func addLogoHall(_ sender: AnyObject) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .photoLibrary
    present(picker, animated: true, completion: nil)
}

@objc func addMainPhoto(_ sender: AnyObject) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .photoLibrary
    present(picker, animated: true, completion: nil)
}

func configureGestureRecognizer() {
    let addHallLogo = UITapGestureRecognizer(target: self, action: #selector(AddPhotoAndLogoViewController.addLogoHall(_:)))
    logoImageView.isUserInteractionEnabled = true
    logoImageView.addGestureRecognizer(addHallLogo)
    let addMainPhotoImage = UITapGestureRecognizer(target: self, action: #selector(AddPhotoAndLogoViewController.addMainPhoto(_:)))
    mainPhotoImageView.isUserInteractionEnabled = true
    mainPhotoImageView.addGestureRecognizer(addMainPhotoImage)
}

所以在 func imagePickerController 中,我需要检测使用了哪个 gestureRecognizer。或者也许有其他机会去做?

您可以像这样为选择器使用不同的标签:

@objc func addLogoHall(_ sender: AnyObject) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.sourceType = .photoLibrary
    picker.view.tag = 1
    present(picker, animated: true, completion: nil)
}

@objc func addMainPhoto(_ sender: AnyObject) {
    let picker = UIImagePickerController()
    picker.delegate = self
    picker.allowsEditing = true
    picker.view.tag = 2
    picker.sourceType = .photoLibrary
    present(picker, animated: true, completion: nil)
}

然后你可以像这样通过这个标签来识别:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let chosenImage = info[UIImagePickerControllerEditedImage] as? UIImage
    if chosenImage != nil {
       if(picker.view.tag == 1) {
          logoImageView.image = chosenImage
        } else {
          mainImageView.image = chosenImage
        }

        dismiss(animated: true, completion: nil)
    }
}

虽然 Jogendar 的回答很好,但我看到了一个陷阱。 if-else 将随着视图控制器文件中图像视图实例数量的增加而增长。这可能会很快变得混乱和不必要的大。我可以建议一个替代解决方案:

class ImageSelectionController: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    weak var delegate: ImageSelectionControllerDelegate?
    private weak var imageView: UIImageView?
    private weak var presentingViewController: UIViewController?

    // MARK: - Initialization
    init(withImageView imageView: UIImageView?, andPresentingViewController viewController: UIViewController?) {
        self.imageView = imageView
        self.presentingViewController = viewController
    }

    // MARK: - Public
    func presentImagePickerController(withConfigurationHandler handler: ((UIImagePickerController) -> Void)? = nil) -> Void {
        let picker = UIImagePickerController()
        picker.allowsEditing = true
        picker.sourceType = .photoLibrary
        handler?(picker)
        picker.delegate = self
    }

    // MARK: - UIImagePickerController
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let chosenImage = info[UIImagePickerControllerEditedImage] as? UIImage
        self.imageView?.image = chosenImage
        self.delegate?.controller(self, didFinishPickingImage: chosenImage, forImageView: self.imageView)
        picker.dismiss(animated: true, completion: nil)
    }

}

protocol ImageSelectionControllerDelegate: AnyObject {
    func controller(_ controller: ImageSelectionController, didFinishPickingImage image: UIImage?, forImageView: UIImageView?) -> Void
}

// ---- 你的视图控制器 ---- //

@IBOutlet weak var logoImageView: UIImageView?
@IBOutlet weak var mainPhotoImageView: UIImageView?

override func viewDidLoad() {
    super.viewDidLoad()

    configureGestureRecognizer()

}

@objc func addLogoHall(_ sender: AnyObject) {
    let controller = ImageSelectionController.init(withImageView: self.logoImageView, andPresentingViewController: self)
    controller.delegate = self
    controller.presentImagePickerController()
}

@objc func addMainPhoto(_ sender: AnyObject) {
    let controller = ImageSelectionController.init(withImageView: self.logoImageView, andPresentingViewController: self)
    controller.presentImagePickerController { (picker) in
        picker.sourceType = .camera
    }
}

// MARK: - ImageSelectionControllerDelegate
func controller(_ controller: ImageSelectionController, didFinishPickingImage image: UIImage?, forImageView: UIImageView?) {
    print("image picked!")
}

这样做,您可以将所有 UIImagePickerController 相关代码放在一个地方,并且您不需要任何 if-else 情况。同样,没有正确或错误的答案,有人可能还会在我的解决方案中发现其他缺陷。这只是您想要如何构建代码的问题。

编码愉快!