2

我有包含许多单元格的 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 ?
预先感谢

4

2 回答 2

6

这样做的一种方法是向每个UigitiveViewCell添加UiLongressurEreceregognizer(所有使用相同的选择器),然后调用选择器时可以通过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;
}
于 2012-05-05T07:41:17.693 回答
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 可能会触发多次。

谢谢...!

于 2012-05-05T07:40:45.393 回答