首页 > 解决方案 > 如何在两个 UIImageViews 一个 View Controller,UIImagePickerController 上显示两个图像?

问题描述

当我点击两个不同的 UIImageView 并选择后,我想从手机库中选择图像,将它们显示在两个不同的 UIImageView 上,但是当我运行以下代码时,相同的图像显示在两个不同的 UIImageView 上,我该如何解决?'''

extension SettingProfileViewController:UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
           profilePhoto.image = image
            print("profile")
        }

        if let wallImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            wallpaperPhoto.image = wallImage
            print("wallpaper")
        }


        dismiss(animated: true, completion: nil)

    }

}
override func viewDidLoad() {
        super.viewDidLoad()
     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectProfilePhotoView))
        profilePhoto.addGestureRecognizer(tapGesture)
        profilePhoto.isUserInteractionEnabled = true

     let wallTapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelectWallpaperImageView))
        wallpaperPhoto.addGestureRecognizer(wallTapGesture)
        wallpaperPhoto.isUserInteractionEnabled = true
}

 @objc func handleSelectProfilePhotoView(){
        let pickerController = UIImagePickerController() //открывает галерею
        pickerController.delegate = self
        present(pickerController, animated: true, completion: nil)
    }


    @objc func handleSelectWallpaperImageView(){
        let pickerCont = UIImagePickerController()
        pickerCont.delegate = self
        present(pickerCont, animated: true, completion: nil)
    }

'''

标签: iosswiftuiimagepickercontroller

解决方案


您观察到的是,当用户点击任何图像视图(wallpaperPhotoprofilePhoto)时,UIImagePickerController总是将self其用作其委托。然后,当用户选择图像时,代理无法再区分最初点击的是哪个图像视图。

您可以简单地添加一个弱可选变量来指示“活动”点击的图像视图,然后只设置它的图像。此外,您可以使用sender参数(即用户点击的图像视图)将点击处理程序简化为单个函数,并将其设置activeImageView为 this。

extension SettingProfileViewController:UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    weak var activeImageView:UIImageView? = nil

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
           activeImageView.image = image
        }
        dismiss(animated: true, completion: nil)
    }


    override func viewDidLoad() {
         super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelect(_:))
            profilePhoto.addGestureRecognizer(tapGesture)
            profilePhoto.isUserInteractionEnabled = true

         let wallTapGesture = UITapGestureRecognizer(target: self, action: #selector(SettingProfileViewController.handleSelect(_:)))
            wallpaperPhoto.addGestureRecognizer(wallTapGesture)
            wallpaperPhoto.isUserInteractionEnabled = true
    }

    @objc func handleSelect(sender:UIGestureRecognizer) {
        guard let sendingImageView = sender.view as? UIImageView else {
            print("Ooops, received this gesture not from an ImageView")
            return
        }
        activeImageView = sendingImageView
        let pickerController = UIImagePickerController() //открывает галерею
        pickerController.delegate = self
        present(pickerController, animated: true, completion: nil)
    }

// ...

推荐阅读