UIImage с UITapGestureRecognizer в первой строке UITableViewController не работает должным образом - PullRequest
0 голосов
/ 20 марта 2012

У меня есть подкласс UITableViewController, который подклассируется двумя другими классами.В некоторых ячейках обеих таблиц у меня есть изображение, по которому пользователь может щелкнуть, чтобы выполнить действие.Все работает, и я счастлив, за исключением того, что в одном из 2 подклассов есть проблема в первой строке этой таблицы.Вы можете нажать только на изображение, нажав на крайний правый край изображения.Если вы щелкнете в теле изображения, то вместо этого вызовет таблицу didSelectRowAtIndexPath.

Меня поражает то, что он работает в другом классе для всех строк и даже в том, в котором он не работает, работает во всех других строках, где отображается это изображение.Вот код, который я использую для добавления распознавателя изображений и жестов в свою ячейку:

        UIImageView *imgparent = [[UIImageView alloc] initWithFrame:CGRectMake(offsetleftmain, 24.0, 14.0, 16.0)];
        imgparent.image = [UIImage imageNamed:@"item_open.png"];
        imgparent.tag = ITEMOPENTAG;
        // add listener
        imgparent.userInteractionEnabled = YES;
        UITapGestureRecognizer *singleFingerDTapParent = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(loadChildren:)];
        [imgparent addGestureRecognizer:singleFingerDTapParent];
        [singleFingerDTapParent release];
        [cell.contentView addSubview:imgparent];
        [imgparent release];

Кстати, я тестирую в симуляторе.Я попытался заменить изображение кнопкой, но проблема все еще сохраняется.Есть идеи?

РЕДАКТИРОВАТЬ: Вот начало кода, который вызывается при нажатии на изображение.Опять же, это работает, но в случае этой единственной строки это работает, только если вы нажмете на правый край изображения.Я приложил скриншот, чтобы проиллюстрировать.Первый кружок показывает, где я должен нажать, чтобы получить вызов моего жеста.Второй показывает пример в той же таблице, которая позволяет щелкнуть все изображение.Я в замешательстве.

- (void)loadChildren:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"loadChildren");

    // get the cell
    UITableViewCell *cell = (UITableViewCell *)gestureRecognizer.view.superview.superview;
    UIImageView *imgvw = (UIImageView *)[cell viewWithTag:ITEMOPENTAG]; // open arrow
    [imgvw setHidden:YES]; // hide open arrow
    imgvw = (UIImageView *)[cell viewWithTag:ITEMCLOSETAG]; // close arrow
    [imgvw setHidden:NO]; // show close arrow

    // get the record for the cell
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
}

enter image description here

РЕДАКТИРОВАТЬ: Вот полный tableView:cellForRowAtIndexPath:indexPath.Имейте в виду, что он вызывается из cellForRowAtIndexPath из 2 других подклассов этого класса, каждый из которых просто передает идентификатор withType:

- (UITableViewCell *)tableView:(UITableView *)tv
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
                      withType:(NSString *)s_type
{

    UITableViewCell *cell = nil;

    // if dealing with empty region then show no tasks cell
    if(s_type == @"noTasksCell"){
        cell = [tv dequeueReusableCellWithIdentifier:@"noTasksCell"];
        if( cell == nil ) { 
            cell = [[[UITableViewCell alloc]
                     initWithStyle:UITableViewCellStyleDefault 
                     reuseIdentifier:@"noTasksCell"] autorelease];
        }           
        cell.textLabel.text = @"No tasks";
        cell.textLabel.textColor = [UIColor lightGrayColor];
        cell.textLabel.font = [UIFont systemFontOfSize:14];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        return cell;
    }

    UILabel *lblMain;
    NSDictionary *o_rec = [self getRecForPath:indexPath];
    NSString *s_cell = @"rowCell";
    BOOL b_parent = NO;
    BOOL b_parentOpen = NO;
    BOOL b_child = NO;
    BOOL b_checked = NO;
    if([self isParent:indexPath]){
        b_parent = YES;
        b_parentOpen = !([o_rec objectForKey:@"b_open"] == nil || [[o_rec objectForKey:@"b_open"] isEqualToNumber:[NSNumber numberWithInt:0]]);
        s_cell = [s_cell stringByAppendingString:@"Parent"];
    }
    if([o_rec objectForKey:@"b_child"] != nil){
        b_child = YES;
        s_cell = [s_cell stringByAppendingString:[NSString stringWithFormat:@"Child%@",[o_rec objectForKey:@"indent"]]];
    }
    if([[o_rec objectForKey:@"checked"] isEqualToNumber:[NSNumber numberWithInt:1]]){
        b_checked = YES;
        s_cell = [s_cell stringByAppendingString:@"isComplete"];
    }
    // add the following to the name:
    //  - project id
    //  - width of table to the name so that rotations will change the cell dequeue names
    // - priority
    s_cell = [s_cell stringByAppendingFormat:
              @"Proj%@Width%dP%@"
              ,[o_rec objectForKey:@"project_id"]
              ,(int)tv.bounds.size.width
              ,[[o_rec objectForKey:@"priority"] stringValue]
              ];

    cell = [tv dequeueReusableCellWithIdentifier:s_cell];
    if( cell == nil ) { 
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault reuseIdentifier:s_cell] autorelease];
        cell.textLabel.hidden = YES; // hide the regular text label
        cell.selectedBackgroundView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
        cell.selectedBackgroundView.backgroundColor = [delegate colorForHexWithAlpha:0xffcc66ff];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        int offsetleftmain = 10;
        if(b_child){
            offsetleftmain += ([[o_rec objectForKey:@"indent"] intValue]-1) * 18;
        }
        if(b_parent){
            // parent arrow
            UIImageView *imgparent = [[UIImageView alloc] initWithFrame:CGRectMake(offsetleftmain, 24.0, 14.0, 16.0)];
            imgparent.image = [UIImage imageNamed:@"item_open.png"];
            imgparent.tag = ITEMOPENTAG;
            // add listener
            imgparent.userInteractionEnabled = YES;
            UITapGestureRecognizer *singleFingerDTapParent = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(loadChildren:)];
            singleFingerDTapParent.numberOfTapsRequired = 1;
            singleFingerDTapParent.numberOfTouchesRequired = 1;
            [imgparent addGestureRecognizer:singleFingerDTapParent];
            [singleFingerDTapParent release];
            [cell.contentView addSubview:imgparent];
            [imgparent release];
            // close arrow
            UIImageView *imgparent2 = [[UIImageView alloc] initWithFrame:CGRectMake(offsetleftmain-2, 24.0, 16.0, 14.0)];
            imgparent2.image = [UIImage imageNamed:@"item_close.png"];
            imgparent2.tag = ITEMCLOSETAG;
            imgparent2.userInteractionEnabled = YES;
            UITapGestureRecognizer *singleFingerDTapParent2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideChildren:)];
            [imgparent2 addGestureRecognizer:singleFingerDTapParent2];
            [singleFingerDTapParent2 release];
            [cell.contentView addSubview:imgparent2];
            [imgparent2 release];
        }
        offsetleftmain += 18;
        // checkbox
        UIImageView *imgchk = [[UIImageView alloc] initWithFrame:CGRectMake(offsetleftmain, 20.0, 24.0, 24.0)];
        imgchk.image = [UIImage imageNamed:@"check_empty.png"];
        imgchk.tag = EMPTYCHECKTAG;
        // add listener
        imgchk.userInteractionEnabled = YES;
        UITapGestureRecognizer *singleFingerDTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkOnItem:)];
        [imgchk addGestureRecognizer:singleFingerDTap];
        [singleFingerDTap release];
        [cell.contentView addSubview:imgchk];
        [imgchk release];
        // checked checkbox
        UIImageView *imgchk2 = [[UIImageView alloc] initWithFrame:CGRectMake(offsetleftmain, 20.0, 24.0, 24.0)];
        imgchk2.image = [UIImage imageNamed:@"check_checked.png"];
        imgchk2.tag = CHECKTAG;
        // add listener
        imgchk2.userInteractionEnabled = YES;
        UITapGestureRecognizer *singleFingerDTap2 = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkOffItem:)];
        [imgchk2 addGestureRecognizer:singleFingerDTap2];
        [singleFingerDTap2 release];
        [cell.contentView addSubview:imgchk2];
        [imgchk2 release];
        offsetleftmain += 28;
        // main label
        lblMain = [[UILabel alloc] initWithFrame:CGRectMake(offsetleftmain, 22.0, tv.bounds.size.width-offsetleftmain-10, 30.0)];
        lblMain.tag = MAINLABELTAG;
        lblMain.numberOfLines = 4;
        lblMain.font = delegate.font_dflt;
        // change color based on priority
        if (5-[[o_rec objectForKey:@"priority"] intValue] == 1)
            lblMain.textColor = [UIColor redColor];
        else if (5-[[o_rec objectForKey:@"priority"] intValue] == 2)
            lblMain.textColor = [delegate colorForHexWithAlpha:H_P2COLOR];
        else if (5-[[o_rec objectForKey:@"priority"] intValue] == 3)
            lblMain.textColor = [delegate colorForHexWithAlpha:H_P3COLOR];

        [cell.contentView addSubview:lblMain];
        [lblMain release];

        // show action sheet for long press and hold
        UILongPressGestureRecognizer *clicknHold = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(cellClicknHold:)];
        [cell addGestureRecognizer:clicknHold];
        [clicknHold release];

    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    // task text
    lblMain = (UILabel *)[cell viewWithTag:MAINLABELTAG];
    lblMain.text = [self formatContent:[o_rec objectForKey:@"content"]];

    CGRect newFrame = lblMain.frame;
    newFrame.size.height = [[o_rec objectForKey:@"height"] floatValue];
    //newFrame.size.height = [[o_rec objectForKey:@"height"] floatValue]+12;
    lblMain.frame = newFrame;
    // set checked status
    [(UIImageView *)[cell viewWithTag:EMPTYCHECKTAG] 
     setHidden:[[o_rec objectForKey:@"checked"] boolValue]];
    [(UIImageView *)[cell viewWithTag:CHECKTAG] 
     setHidden:![[o_rec objectForKey:@"checked"] boolValue]];
    // show open arrow if dealing with parent cell
    if (b_parent) {
        //NSLog(@"b_parentOpen:%d",b_parentOpen);
        [(UIImageView *)[cell viewWithTag:ITEMOPENTAG] setHidden:b_parentOpen];
        [(UIImageView *)[cell viewWithTag:ITEMCLOSETAG] setHidden:!b_parentOpen];
    }

    return cell;
}

1 Ответ

0 голосов
/ 22 марта 2012

На тот случай, если кто-то столкнется с подобной проблемой, настолько редкой, насколько это может быть, возможно, это поможет избежать того, что кто-то облысит и выдернет свои волосы. Таким образом, моя проблема была не с самим tableView, а с боковой панелью, которая похожа на боковую панель facebook, которая скользит внутрь и наружу. У моей боковой панели есть табличное представление, и у этой таблицы есть заголовок, который по какой-то причине, когда он был прямо рядом с моей другой таблицей, каким-то образом предотвращал клики по изображению в этой первой строке. Мое решение состояло в том, чтобы просто расположить эту боковую панель немного дальше от экрана, а не рядом с ней. Задача решена. Спасибо всем, кто пытался мне помочь.

...