为啥我的 UITapGestureRecognizer 在我将它附加到我的 UITableViewCell 中的元素时不起作用?

Posted

技术标签:

【中文标题】为啥我的 UITapGestureRecognizer 在我将它附加到我的 UITableViewCell 中的元素时不起作用?【英文标题】:Why does my UITapGestureRecognizer doesn't work when I attach it to the element in my UITableViewCell?为什么我的 UITapGestureRecognizer 在我将它附加到我的 UITableViewCell 中的元素时不起作用? 【发布时间】:2016-10-18 17:17:08 【问题描述】:

我想覆盖双击 mapView 的默认行为。

在我的swift 应用程序中,我在静态单元格中有一个mapView,所以在cellForRowAt 方法中我决定添加一个UITapGestureRecognizer。我就是这样做的:

func tableView(_ myTable: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    if (indexPath as NSIndexPath).row == 0 
        let cell = myTable.dequeueReusableCell(withIdentifier: "cellStatic") as! MyTableDetailsCell

        cell.mapView.isScrollEnabled = false //this works

        //this does not:
        let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
        tap.numberOfTapsRequired = 2
        cell.mapView.addGestureRecognizer(tap)
        ...

然后我有一个简单的函数:

func doubleTapped() 
    print("map tapped twice")

但是当我点击两次地图时 - 它会放大并且控制台日志中没有打印 - 所以我的代码不起作用。我错过了什么?

【问题讨论】:

尝试设置UserInteractionEnabled = true of cell.mapView hm 那没有帮助...我已经在故事板中设置了它,我也在代码中编写了它,只是为了确定,但到目前为止没有任何成功:| 您要禁用地图视图的滚动和双击自动缩放吗? @NaveenRamanathan 这正是我想做的***.com/questions/40074084/… :) 【参考方案1】:

您必须强制您自己的双击手势识别器禁用mapView 的标准双击手势识别器。 这可以使用委托方法来完成:

使用UIGestureRecognizerDelegate 将您的视图控制器声明为手势识别器的委托

为您自己的双击手势识别器定义一个属性:

var myDoubleTapGestureRecognizer: UITapGestureRecognizer?  

设置双击手势识别器,例如在viewDidLoad

myDoubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
myDoubleTapGestureRecognizer!.numberOfTapsRequired = 2
myDoubleTapGestureRecognizer!.delegate = self
mapView.addGestureRecognizer(myDoubleTapGestureRecognizer!)

注意,委托是在这里设置的。

实现以下委托方法:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, 
                       shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool 
    if ((gestureRecognizer == myDoubleTapGestureRecognizer) && (otherGestureRecognizer is UITapGestureRecognizer)) 
        let otherTapGestureRecognizer = otherGestureRecognizer as! UITapGestureRecognizer
        return otherTapGestureRecognizer.numberOfTapsRequired == 2
    
    return true
  

因此,当您双击mapView 时,如果另一个手势识别器是mapView 的内置双击识别器,则此委托方法返回true。这意味着只有当您自己的双击识别器无法识别双击时,内置的双击识别器才会触发,而它不会。 我测试了一下:地图不再缩放,调用doubleTapped方法。

【讨论】:

Reinhard,非常感谢你,不过有一个问题 - 这里的解决方案 ***.com/questions/40074084/…(与你的建议合并)会一起工作吗? 我猜会的,因为这两个问题似乎是完全独立的。我建议的解决方案应该只禁用内置的双击手势识别器,并保持其他所有内容不变。 谢谢,我一会儿试试,告诉你! 顺便说一句,你认为我可以阻止旋转地图的方式相同吗?我无法将其设置为cell.mapView.rotateEnabled = false,所以也许还有其他方法? @user3766930 很高兴为您提供帮助!所以如果你认为答案是正确的,请采纳。对于您的第二个问题:我还认为将 rotateEnabled 设置为 false 会停止旋转。抱歉,但我不知道为什么不是这样。【参考方案2】:

尝试使用 touchesBegan 来识别触摸事件,当触发事件时您可以调用自定义处理程序

【讨论】:

【参考方案3】:

将地图视图添加为 tableViewCell 中容器视图的子视图。设置约束,以便地图视图填充整个容器视图。禁用地图视图的用户交互并将双击手势添加到容器视图。这段代码会有所帮助。

    let cell = myTable.dequeueReusableCell(withIdentifier: "cellStatic") as! MyTableDetailsCell
    let tap = UITapGestureRecognizer(target: self, action: #selector(doubleTapped))
    cell.mapView.isUserInteractionEnabled = false
    cell.containerView.addGestureRecognizer(tap)
    tap.numberOfTapsRequired = 2

现在,当 mapview 被点击两次时,“doubleTapped”选择器将被调用。包括地图视图的旋转手势在内的所有其他用户交互都被禁用。

【讨论】:

以上是关于为啥我的 UITapGestureRecognizer 在我将它附加到我的 UITableViewCell 中的元素时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的程序需要两行输入,为啥我的 GPA 计算错误 c#?

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的碰撞测试总是返回“真”,为啥图像矩形的位置总是错误的 (0, 0)?

NPM 启动错误上的 ENOENT。为啥我会收到此错误,为啥要查找“我的图片”目录?

为啥 main 前面有一个 int ,为啥我的教授会排除它? [复制]

为啥我的 Entity Framework Code First 代理集合为空,为啥我不能设置它?