如何区分UITableViewCell的哪个部分已被点击

use*_*839 16 iphone uitableview ios

我创建了UITableView一个自定义UITableViewCell.我的单元格包括UIImageView左侧和UITextView右侧的单元格.

在里面UITableViewController,我在tableview中设置了图像和文本cellForRowAtIndexPath.

一切都显示正常,但现在我需要实现didSelectRowAtIndex我需要区分是否UIImageViewUITextView细胞已被点击.

假设图像点击表示删除操作和其余的单元格编辑操作.

ste*_*rro 48

您可以将一个手势识别器添加到每个单独的单元格,而不是将其添加到表格视图中,并确定从用户触摸的点选择了哪个单元格,然后确定用户是否触摸了图像或单元格.

首先确保您的控制器采用UIGestureRecognizerDelegate协议.

@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
Run Code Online (Sandbox Code Playgroud)

然后添加UIGestureRecognizerUITableView视图加载时.

    - (void)viewDidLoad
{
    [super viewDidLoad];
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    singleTap.delegate = self;
    singleTap.numberOfTapsRequired = 1;
    singleTap.numberOfTouchesRequired = 1;
    [self.tableView addGestureRecognizer:singleTap];
}
Run Code Online (Sandbox Code Playgroud)

此委托方法确定是否handleTap:应执行该方法.如果它可以indexPath从用户触摸中找到,则返回,YES否则返回NO.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    UITableView *tableView = (UITableView *)gestureRecognizer.view;
    CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
    if ([tableView indexPathForRowAtPoint:p]) {
        return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

一旦我们确定用户是否单击了一个单元格,就会调用handleTap:方法,然后决定用户是否触摸了图像或单元格的任何其他部分.

- (void)handleTap:(UITapGestureRecognizer *)tap
{
    if (UIGestureRecognizerStateEnded == tap.state) {
        UITableView *tableView = (UITableView *)tap.view;
        CGPoint p = [tap locationInView:tap.view];
        NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p];
        [tableView deselectRowAtIndexPath:indexPath animated:NO];
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        CGPoint pointInCell = [tap locationInView:cell];
        if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) {
            // user tapped image
        } else {
            // user tapped cell
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Rok*_*arc 5

你可以继承UITableViewCell和覆盖touchesEnded.

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    [super touchesEnded:touches withEvent:event];

    UITouch *touch = [touches  anyObject];
    CGPoint location = [touch locationInView:self];

    UIView *hitView = [self hitTest:location withEvent:event];

    if (hitView == myImageView) ...;
    if (hitView == myTextView) ...;
}
Run Code Online (Sandbox Code Playgroud)

你需要保持一定的参考您UIImageViewUITextView(他们可能应该是你的电池的特性).

您当然可以覆盖touchesBegan而不是touchesEnded取决于您希望实现的功能.