两个UIImage绑定UITapGestureRecognizer后选图显示异常问题咨询
解决两个UIImageView选图后显示同一张的问题
嘿,这个问题我之前做项目时也踩过坑!本质原因就是你没明确标记当前要更新的是哪个UIImageView,导致图片选择完成后,回调里总是默认更新了第一个视图。下面给你一套清晰的解决步骤:
1. 给UIImageView设置标记并绑定手势
首先给你的两个UIImageView设置不同的tag值,同时确保手势能正确关联到对应的视图:
// 假设你的两个UIImageView实例是imgView1和imgView2 imgView1.tag = 1 imgView2.tag = 2 // 为第一个视图添加点击手势 let tapGesture1 = UITapGestureRecognizer(target: self, action: #selector(onImageViewTapped(_:))) imgView1.addGestureRecognizer(tapGesture1) imgView1.isUserInteractionEnabled = true // 为第二个视图添加点击手势 let tapGesture2 = UITapGestureRecognizer(target: self, action: #selector(onImageViewTapped(_:))) imgView2.addGestureRecognizer(tapGesture2) imgView2.isUserInteractionEnabled = true
2. 记录当前选中的UIImageView
在手势回调方法里,我们需要把当前点击的视图保存下来,这样后续选图后就知道要更新哪个:
// 定义一个变量,用来记录当前被点击的UIImageView(建议加weak避免循环引用) private weak var currentTargetImageView: UIImageView? @objc private func onImageViewTapped(_ gesture: UITapGestureRecognizer) { guard let tappedImageView = gesture.view as? UIImageView else { return } // 保存当前点击的视图 currentTargetImageView = tappedImageView // 弹出选择弹窗 showImageSelectionAlert() } private func showImageSelectionAlert() { let alert = UIAlertController(title: "选择图片来源", message: nil, preferredStyle: .actionSheet) alert.addAction(UIAlertAction(title: "拍照", style: .default) { _ in self.openCamera() }) alert.addAction(UIAlertAction(title: "从相册选择", style: .default) { _ in self.openPhotoLibrary() }) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) present(alert, animated: true) }
3. 在图片选择回调中更新目标视图
最后在UIImagePickerControllerDelegate的回调方法里,直接用我们保存的currentTargetImageView来设置图片,而不是硬编码指定某个视图:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 获取选中的原图 guard let selectedImage = info[.originalImage] as? UIImage else { print("无法获取选中的图片") return } // 更新当前选中的UIImageView的图片 currentTargetImageView?.image = selectedImage }
额外注意点
- 确保你已经给当前控制器设置了
UIImagePickerControllerDelegate和UINavigationControllerDelegate的代理; - 如果之前用
tag判断时出错,大概率是tag值设置错误或者判断逻辑写错,用保存视图实例的方式会更直观不易出错; - 记得在
openCamera()和openPhotoLibrary()方法里,正确初始化并弹出UIImagePickerController,同时处理权限申请逻辑。
这样修改后,你点击哪个UIImageView,选完图片就会更新对应的视图,不会再出现两个视图显示同一张图的问题啦!
内容的提问来源于stack exchange,提问作者Ricardo Milos
相关产品推荐
相关产品推荐

