如何识别调用了哪个点击手势识别器?

Posted

技术标签:

【中文标题】如何识别调用了哪个点击手势识别器?【英文标题】:how to identify which tap gesture recognizer is called? 【发布时间】:2018-01-15 09:50:39 【问题描述】:

我有 2 个 UIImageView,分别命名为“artistImage”和“albumImage”,每个都包含 1 个点击手势,所有手势都连接到 1 个名为“artistImageTap”的 @IBAction。这些点击手势是从对象库中拖动并放置在我的 ImageView 上。

故事板 - 代码

我的应用程序有一个艺术家、专辑和歌曲列表,当点击一首歌曲时,应用程序会移动到此视图并显示其详细信息。如果我单击添加按钮,应用程序将移动到此视图,但这次所有文本字段都是可编辑的,图像是默认的,用户可以点击它们从库中选择图像以创建新歌曲。

我的问题是我不知道如何识别哪个 UIImageView 被点击。正如你在图片中看到的,我尝试了 picker.restorationIdentifier 但它总是返回 nil。

@IBAction func artistImageTap(_ sender: UITapGestureRecognizer) 
    let imagePickerController = UIImagePickerController()

    // Only allow photos to be picked, not taken.
    imagePickerController.sourceType = .photoLibrary
    // Make sure ViewController is notified when the user picks an image.
    imagePickerController.delegate = self
    present(imagePickerController, animated: true, completion: nil)


func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 

    // The info dictionary may contain multiple representations of the image. You want to use the original.
    guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else 
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    

    // Set photoImageView to display the selected image.
    if picker.restorationIdentifier == "artistImage" 
        artistImage.image = selectedImage
     else 
        albumImage.image = selectedImage
    
    // Dismiss the picker.
    dismiss(animated: true, completion: nil)

感谢每一个帮助!

【问题讨论】:

没有人知道您是如何创建手势识别器的。 使用sender.view并在你的UIImageView中设置一个tag,之后你可以使用sender.view.tag作为标识符 @ElTomato 我通过从对象库中拖动来添加它们。抱歉没有提及! @ReinierMelian 我尝试为我的视图、滚动视图、内容视图甚至 ImageView 设置标签,但是当我使用 sender.view.tag 时它们都没有出现 使用debugPrint(sender.view) 告诉我@hell2809 打印的内容 【参考方案1】:

从情节提要向两个 UIImageView 添加标签。 比如artistImage = 1001 和albumImage = 1002

@IBAction func artistImageTap(_ sender: UITapGestureRecognizer) 

if sender.view?.tag == 1001 

    selectedTag = 1001

 else if sender.view?.tag == 1002 

   selectedTag = 1002



let imagePickerController = UIImagePickerController()

// Only allow photos to be picked, not taken.
imagePickerController.sourceType = .photoLibrary
// Make sure ViewController is notified when the user picks an image.
imagePickerController.delegate = self
present(imagePickerController, animated: true, completion: nil)
 

将选定的标签存储在一个变量中。

现在您可以使用selectedTag 变量检查用户点击了哪些图像

【讨论】:

@hell2809 毫无疑问,这个问题很有帮助。但玩标签是不好的做法。所以不要像创建 IBAction 那样创建 Tap Gesture 对象的创建 IBOutlet。并将 IBOutlet 与 sender 对象进行比较以更清楚:)【参考方案2】:

在图像上应用时,首先为点击手势设置标签。

tapGestureArtistImage.tag = 0;
tapGestureAlbumImage.tag = 1;

然后在artistImageTap方法中将点击手势作为参数发送

- (void) artistImageTap:(UITapGestureRecognizer*)sender

  if(sender.tag == 0)
  
    // artistImage tapped
  
  else if (sender.tag == 1)
  
    // albumImage tapped
  

【讨论】:

找到了我的方式,和你的一样!谢谢!

以上是关于如何识别调用了哪个点击手势识别器?的主要内容,如果未能解决你的问题,请参考以下文章

SWIFT4:如何让两个点击手势识别器一起工作

表格视图单元格中 UIView 上的手势识别器

手势识别器阻止触摸已结束

如何实现检测点击事件的全局手势识别器?

如何以编程方式触发 UIView 的点击手势识别器

如果将点击手势识别器添加到其背景视图中,则不会调用 iOS didSelectItemAtIndexPath