如何检测UITableView清晰部分的点击?

Vic*_*nec 23 objective-c uitableview ios

我有UITableView的视图控制器.表格视图的高度是静态的,==屏幕的高度.表中的行数可以更改,有时可能是行数小于可见行数的情况,因此在表底部会出现一些清晰区域.我可以在没有手势识别器的情况下检测到它吗?是否有一些UITableView的委托方法?

Con*_*nor 42

所有提供的答案,包括接受的答案,添加UITapGestureRecognizertableView; 虽然这会起作用,但我发现这个手势识别器可以didSelectRowAtIndexPath以某种不可预测/不确定的方式干扰行抽头和触发.

如果你想检测"空白"和行中的点击,我强烈建议你在桌面上添加一个背景视图,并在那里添加手势识别器:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.backgroundView = UIView()
self.tableView.backgroundView?.addGestureRecognizer(tap)
Run Code Online (Sandbox Code Playgroud)

  • **这是最佳答案**:它还保留了`tableView`选择响应器,因此您还可以看到行的选择. (7认同)

Sto*_*nz2 40

是的,有委托方法,例如:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Run Code Online (Sandbox Code Playgroud)

但是,这只会告诉您是否在现有行上进行了点击.如果要捕获行下方空白区域(或节标题上)的点击,则需要使用手势识别器.你可以这样做:

// in viewDidLoad or somewhere similar
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTapped:)];
[self.tableView addGestureRecognizer:tap];
//.........

- (void)tableTapped:(UITapGestureRecognizer *)tap
{
    CGPoint location = [tap locationInView:self.tableView];
    NSIndexPath *path = [self.tableView indexPathForRowAtPoint:location];

    if(path)
    {
        // tap was on existing row, so pass it to the delegate method
        [self tableView:self.tableView didSelectRowAtIndexPath:path];
    }
    else
    {
        // handle tap on empty space below existing rows however you want
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于另一种方法,考虑Connor Neville从他在这篇文章中的答案的方法,并将手势识别器添加到表格的背景中.


Rom*_*zak 21

感谢@ Stonz2,swift版本:

斯威夫特4

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)

@objc func tableTapped(tap:UITapGestureRecognizer) {
    let location = tap.location(in: self.tableView)
    let path = self.tableView.indexPathForRow(at: location)
    if let indexPathForRow = path {
        self.tableView(self.tableView, didSelectRowAt: indexPathForRow)
    } else {
        // handle tap on empty space below existing rows however you want
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)

func tableTapped(tap:UITapGestureRecognizer) {
    let location = tap.location(in: self.tableView)
    let path = self.tableView.indexPathForRow(at: location)
    if let indexPathForRow = path {
        self.tableView(self.tableView, didSelectRowAt: indexPathForRow)
    } else {
        // handle tap on empty space below existing rows however you want
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

let tap = UITapGestureRecognizer(target: self, action: #selector(tableTapped))
self.tableView.addGestureRecognizer(tap)


func tableTapped(tap:UITapGestureRecognizer) {
    let location = tap.locationInView(self.tableView)
    let path = self.tableView.indexPathForRowAtPoint(location)
    if let indexPathForRow = path {
        self.tableView(self.tableView, didSelectRowAtIndexPath: indexPathForRow)
    } else {
        // handle tap on empty space below existing rows however you want
    }
}
Run Code Online (Sandbox Code Playgroud)