我正在尝试实现类似界面的Twitter iPhone应用程序。 (滑动以使用自定义视图替换tableviewcell中的视图)。我正在使用Apple的UISwipeGestureRecognizer识别滑动,并且正在使用[recognizer locationInView:self.view]获取该滑动的开始位置。这给了我一个CGPoint,我在[tableView indexPathForRowAtPoint:location]中使用它。我的问题是,似乎总是在刷入的实际行上方或下方的一行中检测到我的滑动。是否有人遇到过相同的问题?

编辑:我可能还应该提到,我正在使用自定义tableview单元格,并且它的高度大于默认视图。我不确定这是否有区别,我正在使用heightForRowIndexAtPath:返回高度。

我的代码是-

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
ModelObject *rowData = (ModelObject *)[tempArr objectAtIndex:indexPath.row];
if (rowData.isAlternateView) {
        // Load alternateview
    UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [cell addGestureRecognizer:recognizer];
    [recognizer release];
    return cell;

}
else {
    // Load the correct uitableviewcell
    UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [cell addGestureRecognizer:recognizer];
    [recognizer release];

    return cell;
}

}


-(void) handleSwipe:(UISwipeGestureRecognizer *) recognizer
{
NSLog(@"Swipe detected!");
CGPoint location = [recognizer locationInView:self.view];
NSIndexPath *selectedIndexPath = [tableView indexPathForRowAtPoint:location];
NSLog(@"Swipe detected at %d", selectedIndexPath.row);
ModelObject *rowData = (ModelObject *)[modelArr objectAtIndex:selectedIndexPath.row];
rowData.isAlternateView = YES;

for (int i=0; i<[tempArr count]; i++) {
    if (i!=selectedIndexPath.row) {
        ModelObject *rowToBeCleared = (ModelObject *) [modelArr objectAtIndex:i];
        if ([rowToBeCleared isAlternateView]) {
            [rowToBeCleared setIsAlternateView:NO];
            [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:[NSIndexPath indexPathForRow:i inSection:0],nil] withRowAnimation:UITableViewRowAnimationLeft];
        }
    }
}

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:selectedIndexPath,nil] withRowAnimation:UITableViewRowAnimationRight];
}

最佳答案

首先,建议不要在每个包含单元格视图的整个视图中添加一个手势识别器,否则建议不要在每个单元格中添加一个手势识别器(或者如果是UITableViewController,则它们是同一对象)。

在viewDidLoad中:

UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc]
    initWithTarget:self action:@selector(handleSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];


然后,在handleSwipe方法中:

- (void)handleSwipe:(UISwipeGestureRecognizer *) recognizer
{
    //might need to check if swipe has ended (otherwise not time to handle yet)
    if (recognizer.state != UIGestureRecognizerStateEnded)
        return;

    CGPoint location = [recognizer locationInView:tableView]; //not self.view
    NSIndexPath *selectedIndexPath = [tableView indexPathForRowAtPoint:location];

    if (selectedIndexPath != nil)
    {
        //user swiped on a tableview cell
    }
    else
    {
        //user did not swipe on a tableview cell
    }
}

关于iphone - indexPathForRowAtPoint不会给我正确的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4148264/

10-13 03:15