Проверка, какой жестRecognizer был нажат - PullRequest
0 голосов
/ 07 января 2019

Я использую gestureRecognizer с UIImageView. И у меня есть два UIImageView. Мне нужно загрузить изображение в UIImageView. Для открытия UIImagePickerController() я использую gestureRecognizer на обоих UIImageView.

Так что мне нужно загрузить изображение в другой UIImageView в func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])

Как загрузить изображение из библиотеки?

Это мой код:

@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 был использован. Или, может быть, есть альтернативная возможность сделать это?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Хотя ответ Джогендара хорош, я вижу одну ловушку. 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. Опять же, нет правильного или неправильного ответа, и кто-то может также найти какой-то другой недостаток в моем решении. Вопрос только в том, как вы хотите структурировать свой код.

Удачного кодирования!

0 голосов
/ 07 января 2019

Вы можете добавить различные теги для сборщиков следующим образом:

@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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...