UITableViewCell使用UITapGestureRecognizer在UIView中进行了选择

时间:2017-03-03 13:05:41

标签: swift uitableview uiview uitapgesturerecognizer didselectrowatindexpath

我无法解决这个问题。

我的UIViewUITapGestureRecognizer

在这个视图中我放了(较小的)UITableView。而现在,如果我轻拍细胞, 未调用didSelectRowAt,因为UIView点击识别器会检测到点按。 (它的方法被称为。)

我如何解决这个问题,UITableView没有通过触摸到视图。

我尝试设置

table.isUserInteractionEnabled = true

table.isExclusiveTouch = true

但它没有帮助

编辑:

你的很多答案都表明我在下面有一个tableView视图,但事实并非如此。

我会粘贴一些代码(为方便起见改了一下):

class Panel: UIView {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setTapGesture()
    }

    func setTapGesture() {

        tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(UIControlCenterPanel.tapOnPanel(recogniser:)))
        self.addGestureRecognizer(tapGesture)
    }

    func tapOnPanel(recogniser : UITapGestureRecognizer) {
        print("Tap was made")
    }
 }


  class MyPanel: Panel, UITableViewDelegate {
      let table = MyTable()

      override init(frame: CGRect) {
          super.init(frame: frame)

          table.table.delegate = self
          table.isUserInteractionEnabled = true  // This was added as a test
          table.table.isExclusiveTouch = true    // This was added as a test
          table.translatesAutoresizingMaskIntoConstraints = false
          addSubview(table)
          .... // constraints added below
      }

      func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          print("cell tapped")
      }
  }

  class MyTable: UIView {

      let table = UITableView()

      override init(frame: CGRect) {
          super.init(frame: frame)

          table.translatesAutoresizingMaskIntoConstraints = false
          addSubview(table)
      }
  }

如果我现在点击单元格,则会打印:

Tap was made

如果我将这样的手势识别器注释掉:

func setTapGesture() {

       // tapGesture = UITapGestureRecognizer.init(target: self, action: #selector(UIControlCenterPanel.tapOnPanel(recogniser:)))
       // self.addGestureRecognizer(tapGesture)
}

然后打印出来:

cell tapped

5 个答案:

答案 0 :(得分:1)

您可以覆盖容器UIView的hitTest方法,只让子视图(如果有)接收触摸事件,但从不接受。这允许搜索继续下面的无关视图。只需将UIView替换为此类的实例:

class PassThroughView: UIView {

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let result = super.hitTest(point, with: event)
        return result == self ? nil : result
    }
}

答案 1 :(得分:0)

BOOL中返回适当的gestureRecognizer:shouldReceiveTouch:值可让您将触摸传播到所需的子视图。
实现此目的的一些示例代码可以是:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{

    if([touch.view isDescendantOfView:table]){
        return NO; // or YES, as desired
    }
}
  • 此功能需要在ViewController.m
  • 中实施
  • 您需要一个表格实例,可以是@property,也可以通过viewWithTag:提取

答案 2 :(得分:0)

  

让tap = UITapGestureRecognizer(目标:自我,行动​​:   选择器(“handleTap:”))tap.delegate = self tap.cancelsTouchesInView =   假   view.addGestureRecognizer(点击)//默认视图

     

func handleTap(sender:UITapGestureRecognizer?= nil){       view.endEditing(true)// keyboars hides}

答案 3 :(得分:0)

试试此代码

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    if touch.view.isDescendantOf(yourTableView) {
        return false
    }
    return true
}

答案 4 :(得分:0)

您可以参考问题中所述的答案。

链接:UITapGestureRecognizer breaks UITableView didSelectRowAtIndexPath

根据触摸视图的类型设置委托以过滤有效触摸是最佳解决方案。一些答案建议使用cancelsTouchesInView = false来解决这个问题,但它实际上同时触发了UITableView didSelectRowAt和UITapGestureRecognizer选择器。为自己选择合适的。