16

UITableViewカスタムでを作成しましたUITableViewCell。私のセルにはUIImageView、左側とUITextView右側に1つあります。

内部UITableViewControllerでは、テーブルビューに画像とテキストの両方を設定しますcellForRowAtIndexPath

すべてが正常に表示されますが、実装する必要があり、セルのまたはがクリックされたdidSelectRowAtIndexかどうかを区別する必要があります。UIImageViewUITextView

たとえば、画像のクリックは、削除アクションと残りのセル編集アクションを表しています。

4

5 に答える 5

50

ジェスチャ認識機能を個々のセルに追加するのではなく、テーブルビューに追加して、ユーザーがタッチしたポイントから選択されたセルを判別し、ユーザーが画像またはセルにタッチしたかどうかを判別できます。

まず、コントローラーがUIGestureRecognizerDelegateプロトコルを採用していることを確認します。

@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end

次に、ビューが読み込まUIGestureRecognizerれたときににを追加します。UITableView

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

このデリゲートメソッドは、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;
}

ユーザーがセルをクリックしたかどうかを判断すると、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
        }
    }
}
于 2012-06-17T12:16:07.737 に答える
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) ...;
}

あなたはあなたのとへのいくらかの参照を保つ必要がありますUIImageViewUITextViewそれらはおそらくあなたのセルの特性であるはずです)。

もちろん、実現したい機能に応じて、touchesBeganの代わりにオーバーライドすることができます。touchesEnded

于 2012-06-17T11:31:10.920 に答える
1

非常に抽象的で一般的な答えは、次のことを行うことです。追加するUIImageとUILabelごとに、タグをindexPath.row

//When creating the label and image add a recognizer to them
label.tag = indexPath.row;
imageView.tag = indexPath.row;

次に、各画像とラベルにUITapGestureRecognizerを追加します。

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 
                                                                                 action:@selector(handleTap:)];
    [label addGestureRecognizer:recognizer];
    [imageView addGestureRecognizer:recognizer];
}

- (void) handleTap:(UITapGestureRecognizer*)recognizer
{
    UIView *view = recognizer.view;
    int row = view.tag;
    if ([view isKindOfClass:[UILabel class]]) {
        //Row is row
        //and the label is pressed
    }

    if ([view isKindOfClass:[UIImageView class]]) {
        //Row is row
        //and the imageview is pressed
    }
}
于 2012-06-17T11:29:42.257 に答える
1

画像をUIButtonにします。ボタンのアクションがトリガーされると、ユーザーが画像をタップしたことがわかります(セルは選択されません)。セルが選択されている場合、ユーザーが行の別の場所(テキストビューまたはラベルを含む)をタップしたことがわかります。

また、ボタンのtagプロパティを、たとえばセルの行インデックスに設定して、どの行の画像がタップされたかを確認できるようにします。

于 2012-06-17T12:09:49.767 に答える
0

2つのオプションがあります:-1---「uitableviewcell」にUITapGestureRecognizerを追加し、それを画像ビューをポイントさせ、「indexpath」をパラメーターとしてセレクターに渡し、デリゲートにそれをtableviewcellに渡します。

UILabel *label = =[UILabel alloc]init];
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTap)]     autorelease];
[label addGestureRecognizer:tapGesture];


-(void)labelTap{
[delegate performselector@selector(labeltapped:)withobject:indexpath];
}

2- 2番目の方法は、タイプ[imageviewまたはlabel]のDidSelectRowAtIndexPathの送信者を確認することです。しかし、私は最初の方法を好みます

于 2012-06-17T11:32:10.087 に答える