使用gestureRecognizer设置UIImageView的图像
Posted
技术标签:
【中文标题】使用gestureRecognizer设置UIImageView的图像【英文标题】:Set image of UIImageView using gestureRecognizer 【发布时间】:2017-04-13 12:51:29 【问题描述】:我在问是否可以使用手势识别器设置 UIImageView 的图像,或者是否有必要在 UIImageView 顶部覆盖一个按钮。
我有一个 UIImageViews 的出口集合,称为 imageViews。其中有四个,它们的标签已设置为从 1 到 4。在我的 viewDidLoad 中,为了将手势识别器添加到集合中的每个图像视图中,我使用了:
override func viewDidLoad()
super.viewDidLoad()
for i in (0..<imageViews.count)
let imageViewTapped = UITapGestureRecognizer(target: self, action: #selector(selectImage(tap:)))
imageViewTapped.numberOfTapsRequired = 1
imageViews[i].addGestureRecognizer(imageViewTapped)
接下来,我将gestureRecognizer 创建为viewController 类中的一个函数。这是创建图像选择器控制器和识别被点击的图像视图的位置:
func selectImage(tap: UITapGestureRecognizer)
var imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = false
imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
guard let viewTappedTag = tap.view?.tag else return
self.selectedImageView = imageViews[viewTappedTag - 1]
selectedImageView 是 viewController 类中的一个变量,类型为 UIImageView。我的想法是这个变量可以保存被点击的UIImageView,由gestureRecognizer识别,如上图所示。然后可以稍后将其传递给代表。
接下来,我创建了代表,didFinishPickingMediaWithInfo 和 didCancel,但为了简洁起见,我只展示前者。两者都是在 viewController 类中创建的:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
self.selectedImageView.image = chosenImage
dismiss(animated: true, completion: nil)
不幸的是,被点击的图像视图的图像没有更新为从库中选择的图像。这样做的正确方法是什么?而且我觉得好像我用所有这些代码使我的 viewController 膨胀,这可以移动到一个单独的类吗?我这样做错了吗,而应该只覆盖一个按钮?
编辑
到目前为止,我能想到的最好的方法是在我的 imagePickerController 中添加一个 switch 语句,其中 imageViewOne、imageViewTwo 等是每个 UIImageView 的出口:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
switch self.viewTappedTag
case 1:
imageViewOne.image = chosenImage
case 2:
imageViewTwo.image = chosenImage
case 3:
imageViewThree.image = chosenImage
case 4:
imageViewFour.image = chosenImage
default:
imageViewOne.image = chosenImage
dismiss(animated: true, completion: nil)
其中 viewTappedTag 是 viewController 类变量,其值由被点击的视图的标签定义,并在gestureRecognizer 中设置。有人可以改进吗?
【问题讨论】:
如果我没记错的话,您的目标是创建一个界面,其中包含 5 个图像视图,其中 4 个具有手势识别器,并且在您点击一个之后..它应该是将获得的图像将新图像从图像选择器控制器添加到 selectedImageView 时发生更改? 嗨@MukulMore,几乎,我有 4 个图像视图,而不是 5 个,但您的其余陈述是正确的。我已将图像视图的标签从 1 设置为 4,因为对象的默认标签值为 0。 【参考方案1】:更新代码如下
在类中声明一个变量如下
var selectedImageViewIndex = 0 //by default selected image view is 0th image view
func selectImage(tap: UITapGestureRecognizer)
var imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = .photoLibrary
imagePicker.allowsEditing = false
imagePicker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
self.present(imagePicker, animated: true, completion: nil)
guard let viewTappedTag = tap.view?.tag else return
self.selectedImageView = imageViews[viewTappedTag - 1]
//Add the following line
self.selectedImageViewIndex = viewTappedTag - 1
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
self.selectedImageView.image = chosenImage
//Add the following line
self.imageView[self.selectedImageViewIndex].image = chosenImage
dismiss(animated: true, completion: nil)
虽然我建议不要使用 viewTappedTag - 1 而是从映射对象中获取索引和点击图像标签的值。
【讨论】:
嗨@Mukul 更多,这不起作用,因为你的变量'selectedImageViewIndex'的类型是一个整数,而收集出口'imageViews'是一个UIImageViews数组。因此,你的类型冲突line 'self.selectedImageViewIndex = imageViews[viewTappedTag - 1]' 因为这将返回 UIImageView,而不是整数。 改成。 self.selectedImageViewIndex = viewTappedTag - 1. 通过它们在插座集合数组中的位置访问图像视图并不是一个好方法,因为它们的位置是任意的:***.com/questions/14848599/… 请参阅上面的解决方案,其中 switch 语句似乎是更好的解决方案 这就是我推荐使用地图的原因。做事总是有不同的方式。【参考方案2】:最后我使用了switch语句来实现我的目标:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
var chosenImage = UIImage()
chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
switch self.viewTappedTag
case 1:
imageViewOne.image = chosenImage
case 2:
imageViewTwo.image = chosenImage
case 3:
imageViewThree.image = chosenImage
case 4:
imageViewFour.image = chosenImage
default:
imageViewOne.image = chosenImage
dismiss(animated: true, completion: nil)
【讨论】:
以上是关于使用gestureRecognizer设置UIImageView的图像的主要内容,如果未能解决你的问题,请参考以下文章
SpriteKit/Scenekit TouchesBegan 或 GestureRecognizer
xcode - pageviewcontroller 覆盖gestureRecognizers