使用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

带参数的选择器gestureRecognizer

用Swift GestureRecognizer 的几个注意点

处理多个 GestureRecognizers

检查哪个视图发送gestureRecognizer