如何知道在UITableView的标题部分进行了点击?

Nic*_*ico 3 uitableview ios swift

我有时会有一个标题部分(只有一个,因为我只有一个部分).我添加了一个手势(单击),如下所示:

let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
singleTap.numberOfTapsRequired = 1
singleTap.numberOfTouchesRequired = 1
tableView.headerViewForSection(0)?.addGestureRecognizer(singleTap)
Run Code Online (Sandbox Code Playgroud)

有用.问题是,当我的tableView只有几行时,如果我在最后一行(空白区域)下方点击,它也会触发手势.

怎么避免呢?我想的方法可能是检查水龙头的位置是否在标题的范围内,但我不知道该怎么做.

对于正常的行,它很容易,我只是使用tableView.indexPathForRowAtPoint(point: CGPoint)但是标题怎么样?

编辑:

看来我需要注册我的头,当我打电话得到的东西tableView.headerViewForSection(0),但问题是,我的头是一个UIView,而不是一个UITableViewHeaderFooterViewUITableViewCell所以我不能注册它(我想...).

它到目前为止工作,因为我也在表视图上添加了手势.

因此,当手势添加到整个tableView时,当我从手势获取视图时,我得到tableView而不是标题.

所以我所做的是使用其标签从tableView获取标题:

let header = tableView.viewWithTag(Tag.Header.rawValue)
Run Code Online (Sandbox Code Playgroud)

然后检查点击位置是否在标题视图中:

let location = sender.locationInView(sender.view)
if header!.pointInside(location, withEvent: nil) { ... }
Run Code Online (Sandbox Code Playgroud)

zis*_*oft 5

一种可能更好的方法是在viewController的mainView(tableView)上设置gestureRecognizer,并在gestureRecognizer的手势动作中检测tapped视图:

{
    let singleTap = UIShortTapGestureRecognizer(target: self, action: "singleTap:")
    singleTap.numberOfTapsRequired = 1
    singleTap.numberOfTouchesRequired = 1
    tableView.addGestureRecognizer(singleTap)  // <--
}
...

@IBAction func singleTap(tapGestureRecognizer: UIShortTapGestureRecognizer) {
    // detect the tapped view
    var loc = tapGestureRecognizer.locationInView(self.tableView)

    if (CGRectContainsPoint(tableView.headerViewForSection(0)?.frame, loc)) {
        // header was tapped
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Fir*_*iro 5

执行此操作的一个简单方法是,当表通知您(通过UITableViewDelegate)它将要显示标题时,只需附加侦听器:

override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    let singleTap = // setup gesture

    // Add gesture to already created header
    view.addGestureRecognizer(singleTap)
}
Run Code Online (Sandbox Code Playgroud)

然后你可以设置选择器功能:

func singleTap(gesture: UITapGestureRecognizer) {
    let headerView = gesture.view
    // Do something with header view
}
Run Code Online (Sandbox Code Playgroud)