表视图单元格上的长按手势

时间:2012-02-20 20:22:22

标签: objective-c ios uitableview uigesturerecognizer

我想在桌面视图单元格上进行两次互动:正常点击和长按。我使用以下答案来帮助我开始:

Long press on UITableView

问题在于,如果我长按有效单元格,单元格将突出显示蓝色,并且长按手势不会触发(它认为它只是一个简单的点击)。但是,如果我在一个无效的单元格上启动长按手势,然后将我的手指滑动到一个有效的单元格然后释放,它就可以正常工作。

4 个答案:

答案 0 :(得分:28)

可能有更好的答案,但这是一种方法:

首先在表格视图上创建一个长按手势识别器。

UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onLongPress:)];
[self.tableView addGestureRecognizer:longPressRecognizer];

然后,使用可以找到所选行的例程来处理它:

-(void)onLongPress:(UILongPressGestureRecognizer*)pGesture
{
if (pGesture.state == UIGestureRecognizerStateRecognized)
{
    //Do something to tell the user!
}
if (pGesture.state == UIGestureRecognizerStateEnded)
{
    UITableView* tableView = (UITableView*)self.view;
    CGPoint touchPoint = [pGesture locationInView:self.view];
    NSIndexPath* row = [tableView indexPathForRowAtPoint:touchPoint];
    if (row != nil) {
        //Handle the long press on row
    }
}
}

我还没试过,但我认为你可以通过让表格视图上的手势识别器等待长按失败来保持显示选择的行。

答案 1 :(得分:2)

我遇到了同样的问题并找到了一个很好的解决方案。 (至少在iOS 7上)

将此UILongPressGestureRecognizer添加到单元格本身。

self.longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onSelfLongpressDetected:)];
[self addGestureRecognizer:self.longPressGesture];

使用目标自我初始化非常奇怪但很重要,并且还将gestureRecognizer再次添加到self并调用方法onSelfLongpressDetected

答案 2 :(得分:0)

我遇到了一个问题。首先,我尝试在可选择的单元格中向UIView添加长按手势,但它没有工作。解决方案是将手势添加到单元格本身,就像之前在Fabio的回答中所说的那样。

快速添加解决方案:

let longPress = UILongPressGestureRecognizer.init(target: self, action: #selector(longPress(_:)))
longPress.minimumPressDuration = 1.0
cell.addGestureRecognizer(longPress)

我在UITableViewDataSource方法cellForRowAtIndexPath中使用了上面的代码。

答案 3 :(得分:-3)

可能在IB或编程中禁用选择

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];