使用QuickDialog的UITableViewCell:处理所有单元格表面上的触摸事件

时间:2013-10-04 10:18:47

标签: ios objective-c uitableview quickdialog

我使用QuickDialog

在UITableView上使用自定义单元格

在这个自定义单元格中,我有几个UILabel,UIImageView和一个按钮,它具有单元格大小并显示在其他子视图的顶部。

我希望这个按钮处理触摸envent并调用选择器。但即使按钮位于顶部位置,触摸子视图时触摸事件也不会触发。

- (UITableViewCell *)getCellForTableView:(QuickDialogTableView *)tableView controller:(QuickDialogController *)controller
{
    UITableViewCell *cell = [super getCellForTableView:tableView controller:controller];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = cell.frame;

    [btn setEnabled:YES];
    [btn setExclusiveTouch:YES];
    [btn setBackgroundColor:[UIColor blueColor]]; // To check if the button is at the top position
    [btn setStringTag:labelIdText];
    [btn addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside];

    [cell addSubview:label1];
    [cell addSubview:label2];
    [cell addSubview:image1];
    [cell addSubview:image2];
    [cell addSubview:btn];

    cell.userInteractionEnabled = YES;

    return cell;
}

选择器:

- (IBAction)handleTap:(id)sender
{

    NSLog(@"CELL TAPPED : \n");
}

非常感谢。

编辑:

新版代码:

- (UITableViewCell *)getCellForTableView:(QuickDialogTableView *)tableView controller:(QuickDialogController *)controller
{
    UITableViewCell *cell = [super getCellForTableView:tableView controller:controller];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    UIView *top = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.frame.size.width, cell.frame.size.height)];
    UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
    [top setStringTag:labelIdText];
    [top addGestureRecognizer:singleFingerTap];

    [cell.contentView addSubview:label_1];
    [cell.contentView addSubview:label_2];
    [cell.contentView addSubview:image_1];
    [cell.contentView addSubview:image_2];
    [cell.contentView addSubview:top];

    cell.userInteractionEnabled = YES;
    image_1.userInteractionEnabled = YES;
    image_2.userInteractionEnabled = YES;

    return cell;
}

选择器:

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{

    NSLog(@"CELL TAPPED : \n");
}

当我触摸UILabel中包含的文本时,事件处理。 但是,尽管userInteractionEnabled为图像设置为YES,它仍然无法与UIImageView一起使用。

再次感谢。

1 个答案:

答案 0 :(得分:0)

您正在为按钮指定单元格框,然后将其添加到单元格本身。通过这种方式,按钮的位置不是您期望的位置,即使您可以看到按钮,它也不会响应触摸,因为它位于单元格边界之外。 试着改变这个:

btn.frame = cell.frame;

到此:

btn.frame = cell.bounds;

使用UItableViewCell时,请记住将子视图添加到其contentView而不是单元格本身:

[cell.contentView addSubview:aCustomView];