web-dev-qa-db-ja.com

UITableViewCellStyleSubtitleスタイルでUITableViewCellオブジェクトのUIImageViewのタッチを検出する方法

UITableViewCell スタイルのUITableViewCellStyleSubtitleオブジェクト(左側の画像ビュー、太字のテキストラベル、その下に詳細テキストラベル)を使用して作成しています私のテーブル。ここで、UIImageViewに対するタッチを検出し、画像ビューがクリックされたインデックスパス/セルを知る必要があります。使ってみた

cell.textLabel.text = @"Sometext";
NSString *path = [[NSBundle mainBundle] pathForResource:@"emptystar1" ofType:@"png"];
UIImage *theImage = [UIImage imageWithContentsOfFile:path];
cell.imageView.image = theImage;
cell.imageView.userInteractionEnabled = YES; 

しかし、それは機能していません。画像がクリックされるたびに、didSelectRowAtIndexPath:が呼び出されます。別のUITableViewCellを作成し、それにカスタムボタンを追加したくありません。 UIImageView自体へのタッチを検出する方法はありますか?

30
Shri

cellForRowAtIndexPathメソッドにこのコードを追加します

cell.imageView.userInteractionEnabled = YES;
cell.imageView.tag = indexPath.row;

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myFunction:)];
tapped.numberOfTapsRequired = 1;
[cell.imageView addGestureRecognizer:tapped];   
[tapped release];

そして、どのimageViewがクリックされたかを確認するには、selectorメソッドのフラグを確認します

-(void)myFunction :(id) sender
{
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer *) sender;
    NSLog(@"Tag = %d", gesture.view.tag);
}
75
user994299

受け入れられている解決策は現在、iOS 5.0で壊れています。このバグにより、イメージビューのジェスチャレコグナイザーがトリガーされなくなります。公式開発者フォーラムでの調査を通じて、これはiOS 5.0の既知のバグであることがわかりました-gestureRecognizerShouldBegin:[〜#〜] no [〜#〜]を返す内部実装が原因です。このバグは、ジェスチャ認識エンジンのデリゲートをカスタムUITableViewCellサブクラス自体に設定しているときに表示されます。

fixは、ジェスチャー認識エンジンのデリゲートで-gestureRecognizerShouldBegin:をオーバーライドし、[〜#〜] yesを返すことです。 [〜#〜]。このバグは、iOS 5.xの将来のバージョンで修正される予定です。これは、新しいUITableViewCellのコピー/貼り付けAPIを使用していない限り安全です。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return YES;
}
18
Andrew

Swiftの場合、cellForRowAtIndexPathメソッドにこのコードを追加します

cell.imageView?.userInteractionEnabled = true
cell.imageView?.tag = indexPath.row

var tapped:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "TappedOnImage:")
tapped.numberOfTapsRequired = 1
cell.imageView?.addGestureRecognizer(tapped)

そして、どのimageViewがクリックされたかを確認するには、セレクターメソッドのフラグを確認してください

func TappedOnImage(sender:UITapGestureRecognizer){
    println(sender.view?.tag)
}
15
Esqarrouth

それを行う1つの方法は、画像からUIImageViewを作成し、それにジェスチャレコグナイザーを追加することです。以下の例を参照してください

//Create ImageView
UIImageView *theImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"emptystar1.png"]];
theImageView.userInteractionEnabled = YES;

//Add Gesture Recognizer
UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelectedInTable)];
tapped.numberOfTapsRequired = 1;
[theImageView addGestureRecognizer:tapped];
[cell addSubview:theImageView];

//Memory Cleanup
[tapped release];
[theImageView release];

-(void)imageSelectedInTable
{
    NSLog(@"Selected an Image");
}

ただし、読み取り専用なのでUIImageViewUITableViewCellプロパティを単純に使用することはできないため、セルをさらにレイアウトする必要があります。

6
aahrens

私の場合、追加情報だけが、NSFetchedResultsControllerから取得したテーブルセルの画像ファイルに対するタップジェスチャに応答する必要があったため、行ではなくindexPathが必要であるため、行情報。画像の変数を定義しました:

var imgSelected: UIImageView? = nil

ImageView(imgZona)にジェスチャーレコグナイザーを追加しました。

public override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.CellReuseIdentifier, forIndexPath: indexPath) as! ZonasTableViewCell
    let zona = fetchedResultsController.objectAtIndexPath(indexPath) as! Zona

    cell.infoZona = zona

    let tapGestureRecognizer = UITapGestureRecognizer(target:self, action:Selector("imageTapped:"))

    cell.imgZona?.addGestureRecognizer(tapGestureRecognizer)
    cell.imgZona?.userInteractionEnabled = true

    return cell
}

「imageTapped」メソッドで画像を取得し、変数「imgSelected」に保存しました。

func imageTapped(sender: UITapGestureRecognizer) {

    imgSelected = sender.view as? UIImageView
    self.performSegueWithIdentifier("MuestraImagen", sender: self)
}

最後に、「prepareForSegue」メソッドで、タップした画像を表示するためにviewController専用の画像を送信しました。

override public func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let identifier = segue.identifier {
        switch identifier {
        case "MuestraImagen":
            if let vc = segue.destinationViewController as? MuestraImagenViewController {
                if imgSelected != nil {
                    if let img = imgSelected!.image {
                        vc.imgPuente = img
                    }
                }
            }
        default: break
        }
    }
}
2
jsbaes

この問題は次のとおりです。

  • ImageViewをTableViewCellに追加します
  • TableViewCellへのイベントクリックとは異なるImageViewへのイベントクリック

->以下のコードは私と一緒に正しく動作します:

cell.imageView.image = [UIImage imageNamed:@"my_image.png"];
[cell.imageView setUserInteractionEnabled:YES];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(singleTapGestureCaptured:)];    
[cell.imageView addGestureRecognizer:singleTap];

および「singleTapGestureCaptured」関数

- (void)singleTapGestureCaptured:(UITapGestureRecognizer*)gesture{
    NSLog(@"Left Image clicked");
}
0
Bkillnest