2012-03-19 13 views
0

UITableViewControllerサブクラスは2つの他のクラスによってサブクラス化されています。両方のテーブルのセルの中には、ユーザーがクリックしてアクションを実行できるイメージがあります。 2つのサブクラスのいずれかで、そのテーブルの最初の行に問題があることを除いて、すべて動作し、私は満足しています。画像の右端をクリックするだけで画像をクリックできます。イメージの本文をクリックすると、代わりにテーブルのdidSelectRowAtIndexPathが呼び出されます。UITableViewControllerの最初の行にあるUITapGestureRecognizerを持つUIImageが正しく動作しません

私は、それが他のクラスのすべての行で動作し、それが動作しない場合でも、そのイメージが表示される他のすべての行で動作することに気づきます。

 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]; 

私は方法によって、シミュレータでテストしている:ここで私は私の細胞内に画像やジェスチャー認識装置を追加するために使用しているコードです。私はボタンで画像を置き換えようとしましたが、それでも問題は解決しません。何か案は?

編集:ここで画像をクリックしたときに呼び出されるコードの始まりです。繰り返しますが、これはうまくいきますが、その1行の場合、画像の右端をクリックするだけで動作します。説明するためにスクリーンショットを添付しました。最初の円は、ジェスチャーを呼び出すためにタップしなければならない場所を示しています。 2番目の例は、画像全体をクリックすることができる非常に同じテーブルの例を示しています。私は混乱している。

- (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

EDIT:ここでは完全なtableView:cellForRowAtIndexPath:indexPathです。誰かがそれは多分これかもしれな限り稀同様の問題に実行されます念の

- (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; 
} 
+0

さらにコードを投稿できますか?あなたがタップを手渡しているところのように?また、レイヤー(Debug - > Color Blended Layers)を見て、あなたのイメージビューが正しい場所にあることを確認してみましたか? – MishieMoo

+2

ああ、私の、14x16pxとあなたは、それが右端のタッチを検出するだけであると確信しています。参考までに、答えとしてではなく、Appleのヒューマンインタフェースのガイドラインに従ってくださいタッチエリアは少なくとも44x44pxですので、大きなアイコンを作成する必要はありません - ナビゲーションボタンのように見える領域の高さは推奨値より低く、タッチ可能な領域はまだ44pxです。あなたはHIGに細胞を採用しようとする可能性があり、おそらくあなたが問題を見つけるのを助けるでしょう。 –

+0

@ A-Live私はそれを大きくしてみましたが、ダイスはまだありません。右のそれと同じ小さな部分だけがクリック可能です。ここでも、テーブルビューの最初の行にない他のすべてのセルで機能します。このアイコンは表の行にあり、表のセルに表示されている公開アイコンやその他のアイコンと同じくらいの大きさです。 – ragamufin

答えて

0

:このクラスのcellForRowAtIndexPath 2の他のサブクラス、それぞれが単に識別子withTypeに渡してから呼び出されますことを心に留めておいてください誰かが大げさに頭を引っ張ってしまうのを避けるのに役立ちます。だから私の問題は、tableView自体ではなかったが、サイドバーは、私がそれをスライドさせるfacebookのサイドバーに似ています。私のサイドバーにはテーブルビューがあり、そのテーブルには何らかの理由で他のテーブルの横にあったときに、その最初の行の画像へのクリックが何らかの形で妨げられているというヘッダーがあります。私の解決策は、サイドバーのビューを、その横のビューではなく横にあるビューから少し離れたところに配置することでした。問題が解決しました。私を助けようとしたすべての人に感謝します。

関連する問題