ios - 如何在两个 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)
}
'''
解决方案
您观察到的是,当用户点击任何图像视图(wallpaperPhoto
或profilePhoto
)时,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)
}
// ...
推荐阅读
- c++ - 为什么不打印字符串?C++
- r - 如何在用户定义的公式中调用命名变量?使用 dplyr::summarise() 无法识别
- python - 根据条件在多行和多列 Pandas 上设置值
- node.js - Aws Lambda 动态读取用户输入并从 Dynamo 表返回数据
- android - 在 AWK 中打印带有变量的字符串
- python - 如何使用 openpyxl 访问命名范围的某个单元格
- python - 将 cx_Oracle 用于 Python 并接收 TypeError: 'NoneType' object is not iterable when inserting data to table
- python - 在 spacy 3 中更新 ner 模型时出错,有什么建议吗?
- java - 在基于 Spring 的应用程序中使用 JWT 身份验证的 OIDC
- c# - Grpc 服务器端流式 keepalive 配置