一个 UIImagePickerController 用于单个 VC 中的多个 UIImageView

one UIImagePickerController for multiple UIImageViews in a single VC

我正在使用单个 UIImagePickerController 在同一个 viewController 中选择 4 个图像 我不知道问这个问题很热,但如果你看看下面的图片,你可能会明白我的意思

例如:图片(1)用于个人资料照片,图片(2)用于身份证等

这是我得出的结果 when I chose the first image all the other images will show the same one so as the others.

class DriverAplication: UIViewController {

let driverPImg: UIImageView = {
        let image = UIImageView(image: #imageLiteral(resourceName: "DriverPimg"))
        image.layer.cornerRadius = 75
        image.clipsToBounds = true
        image.contentMode = .scaleAspectFill
        image.isUserInteractionEnabled = true
        image.translatesAutoresizingMaskIntoConstraints = false
        return image
    }()

let passImg: UIImageView = {
        let image = UIImageView(image: #imageLiteral(resourceName: "passImg"))
        image.layer.cornerRadius = 75
        image.clipsToBounds = true
        image.contentMode = .scaleAspectFill
        image.isUserInteractionEnabled = true
        image.translatesAutoresizingMaskIntoConstraints = false
        return image
    }()
var profileSelectedImg: UIImage?
var passSelectedImg: UIImage?

override func viewDidLoad() {
        super.viewDidLoad()

view.addSubview(driverPImg)
view.addSubview(passImg)

let profileImgTapGestur = UITapGestureRecognizer(target: self, action: #selector(DriverAplication.selectProfileImage))
        driverPImg.addGestureRecognizer(profileImgTapGestur)
        
        let passImgTapGestur = UITapGestureRecognizer(target: self, action: #selector(DriverAplication.selectProfileImage))
        passImg.addGestureRecognizer(passImgTapGestur)

}

@objc func selectProfileImage(){
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()
            let pickerController = UIImagePickerController()
            pickerController.delegate = self
    //        PiActivityIndicator.startAnimating()
            pickerController.allowsEditing = true
            present(pickerController, animated: true, completion: nil)
            
        }
}

extension DriverAplication: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            
            if let editedImg = info[.editedImage] as? UIImage {
                
                profileSelectedImg = editedImg.withRenderingMode(.alwaysOriginal)
                driverPImg.image = editedImg
                
            } else if let originalImg = info[.originalImage] as? UIImage {
                profileSelectedImg = originalImg.withRenderingMode(.alwaysOriginal)
                driverPImg.image = originalImg
                
            }
        
          if let passEditedImg = info[.editedImage] as? UIImage {
                        
                        passSelectedImg = passEditedImg.withRenderingMode(.alwaysOriginal)
                        passImg.image = passEditedImg
                        
                    } else if let passOriginalImg = info[.originalImage] as? UIImage {
                        passSelectedImg = passOriginalImg.withRenderingMode(.alwaysOriginal)
                        passImg.image = passOriginalImg
                        
                    }
 dismiss(animated: true, completion: nil)
        }
        
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        //        self.PiActivityIndicator.stopAnimating()
                self.dismiss(animated: true, completion: nil)
            }
    
}

您可以制作一个enum来存储可能的选择器类型(个人资料或身份证照片)。

enum PictureSelectionType {
    case profilePicture
    case idPicture
}
class DriverAplication: UIViewController {
    var pictureSelectionType = PictureSelectionType.profilePicture

    /// inside ViewDidLoad... 
    let profileImgTapGestur = UITapGestureRecognizer(target: self, action: #selector(DriverAplication.selectProfileImage))
    driverPImg.addGestureRecognizer(profileImgTapGestur)
        
    let passImgTapGestur = UITapGestureRecognizer(target: self, action: #selector(DriverAplication.selectIDImage))
    passImg.addGestureRecognizer(passImgTapGestur)

   
    @objc func selectProfileImage() {
        /// remember what the picker should return
        pictureSelectionType = .profilePicture
    
        let generator = UIImpactFeedbackGenerator(style: .light)
        generator.impactOccurred()

        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.allowsEditing = true
        present(pickerController, animated: true, completion: nil)
            
    }
    @objc func selectIDImage() {
        /// remember what the picker should return
        pictureSelectionType = .idPicture
    
        let generator = UIImpactFeedbackGenerator(style: .light)
        generator.impactOccurred()

        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        pickerController.allowsEditing = true
        present(pickerController, animated: true, completion: nil)
    }
}

extension DriverAplication: UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
            
        var returnedImage: UIImage?
        if let editedImg = info[.editedImage] as? UIImage {
            returnedImage = editedImg
        } else if let originalImg = info[.originalImage] as? UIImage {
            returnedImage = originalImg    
        }
        
        if let image = returnedImage { /// unwrap the image
 
            /// read what the selection type is
            if pictureSelectionType == .profilePicture {
                driverPImg.image = image
            } else { /// for ID picture
                passImg.image = image
            }
        }

        dismiss(animated: true, completion: nil)
    }
        
    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        self.dismiss(animated: true, completion: nil)
    }
}