iOS - indexPathForRowAtPoint不返回具有不同单元格高度的正确indexPath

时间:2012-05-05 07:30:30

标签: ios uitableview

我有包含许多单元格的UITableView。用户可以通过按下此单元格中的展开按钮来扩展单元格以查看此单元格中的更多内容(只有1个单元格可以在时间扩展):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(selectedRowIndex == indexPath.row) return 205;
    else return 60;
}

在故事板中,我将UILongPressGesture拖到单元格按钮并将其命名为longPress(单元格是自定义的,其中有2个按钮,1需要识别LongPressGesture,其他扩展单元格高度):

@property (retain, nonatomic) IBOutlet UILongPressGestureRecognizer *longPress;

在viewDidLoad中:

- (void)viewDidLoad
{      
    [longPress addTarget:self action:@selector(handleLongPress:)];
}

它完美无缺,但是当我使用以下代码识别单元格indexPath时,扩展一个单元格时出错:

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {         
    // Get index path
    slidePickerPoint = [sender locationInView:self.tableView];
    NSIndexPath *indexPath= [self.tableView indexPathForRowAtPoint:slidePickerPoint]; 
    // It's wrong when 1 cell is expand and the cell's button I hold is below the expand button
}

任何人都可以告诉我如何在不同的单元格高度时获得正确的indexPath吗? 提前谢谢你

2 个答案:

答案 0 :(得分:6)

一种方法是将UILongPressGestureRecognizer添加到每个UITableViewCell(都使用相同的选择器),然后在调用选择器时,您可以通过sender.view获取单元格。也许不是最有效的内存,但如果单个手势识别器在某些情况下不会返回正确的行,这种方式应该有效。

这样的事情:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
  initWithTarget:self action:@selector(handleLongPress:)];
    [longPress setMinimumPressDuration:2.0];
    [cell addGestureRecognizer:longPress];
    [longPress release];

    return cell;
}

然后

- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {  
    UITableViewCell *selectedCell = sender.view;
}

答案 1 :(得分:0)

首先将长按手势识别器添加到表格视图中:

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc] 
  initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 2.0; //seconds
lpgr.delegate = self;
[self.myTableView addGestureRecognizer:lpgr];
[lpgr release];

然后在手势处理程序中:

-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
  if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
  { 
    CGPoint p = [gestureRecognizer locationInView:self.myTableView];

    NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:p];
    if (indexPath == nil)
        NSLog(@"long press on table view but not on a row");
    else
        NSLog(@"long press on table view at row %d", indexPath.row);
    } 
}

你必须小心这一点,这样才不会干扰用户正常敲击单元格,并注意handleLongPress可能会在用户抬起手指之前多次触发。

谢谢...!