UIImageViewのタッチイベントを検出する方法


98

ナビゲーションバーに画像(UIImageView)を配置しました。ここで、タッチイベントを検出して、イベントを処理したいと思います。どうすればそれができるのか教えていただけませんか。

ありがとう。


この状況では、代わりにカスタムUIButtonを使用します(そうする必要があると思います)。
チタニウム

Swiftバージョンの回答を 確認する http://stackoverflow.com/a/41328885/3177007
Mohamed Jaleel Nazir

回答:


137

実際には、そうしないでください。

代わりに、UIImageViewを介してカスタムスタイルのボタン(画像を指定しない限りボタングラフィックはありません)を追加します。次に、呼び出したいメソッドをそれにアタッチします。

この手法は、タッチの要素をいじるのではなく、画面の一部の領域をボタンとして機能させたい場合に多く使用できます。


ナビゲーションバーにボタンを追加しました。タッチイベントも処理できます。ただし、このボタンには丸い画像を追加したいと思います。プログラムでそれを行う方法を教えてください。また、ボタンのプロパティをプログラムで「カスタム」に設定する方法を教えてください。
ebaccount 2009年

UIButtonのドキュメントを見てください。コントロールの状態に背景画像を設定する必要があります。NormalとSelected / Highlightedには異なる画像が必要です。ボタンのスタイルは、UIButtonStyleCustomに設定したものだと思います。ここでも、UIButtonのスタイルプロパティのドキュメントを参照してください。
Kendall Helmstetter Gelner、

1
UIImageViewの上に少し上にUIButtonを追加していませんか?追加のオブジェクトを追加していますが、既存のUIImageViewオブジェクトのtouchesメソッドを実装するだけで済みます。番号?
samvermette、

32
メモリ内のUIButtonのサイズを見ると、事実上何もないので、画面ごとに数個しかありません。無料で手に入るのは、さまざまな状態(内部のタッチアップなど)に対するターゲットアクションの配線全体であり、また、押したときにトリガーされずに指を横にスライドさせるなどの優れた動作です。基本的に、ボタンは、システム全体で最も細かく作成されたオブジェクトの1つであり、カスタムタッチコードを実行すると考えて考えると狂気になります。安価でうまく機能するものを使用し、フレームワークがまだ処理していないもののためにカスタム作業を保存します。
Kendall Helmstetter Gelner、2010

6
必要なものがタッチイベント(addTaget:action:forControlEvents:経由)のみの場合は、UIControlをオーバーレイすることもできます。画像といくつかの状態を持つUIButtonよりも少し安価です。また、プリプロセッサ条件を使用して、オーバーレイされたコントロールの背景色をピンクに変更し、それらがどこにあるかを正確に確認できるようにします(そして、それらが存在することを覚えておいてください:-)。
ジェフ

115

AがUIImageView由来さUIViewから誘導されUIResponder、それはタッチイベントを処理する準備ができていますので。あなたは提供したいと思うtouchesBegantouchesMovedtouchesEnded方法を、ユーザーが画像をタップすると、彼らは呼び出されますよ。必要なのがタップイベントだけの場合は、画像をボタン画像として設定したカスタムボタンを使用する方が簡単です。しかし、タップや移動などをより細かく制御したい場合は、この方法が適しています。

また、さらにいくつかのことを確認する必要があります。

  • canBecomeFirstResponderYESをオーバーライドして返し、ビューがタッチイベントのフォーカスになることを示します(デフォルトはNO)。

  • userInteractionEnabledプロパティをYESに設定します。のデフォルトUIViewsはYESですが、for UIImageViewsはNOなので、明示的にオンにする必要があります。

  • マルチタッチイベント(ピンチ、ズームなど)に応答する場合はmultipleTouchEnabled、YES に設定 します。


私はそれを試しましたが、それでもtouchesBeganイベントを受け取れません...なぜですか?
Markus

5
@Markus:同じ問題がありましたがuserInteractionEnabled、親ビューでYESに設定して修正しました。stackoverflow.com/questions/5887305/…を
Saxon Druce

51

UIImageViewにタッチイベントを追加するには、.mで以下を使用します

UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


-(void)myTapMethod{
    // treat image tap
}

お役に立てば幸いです。


userInteractionEnabled = trueは、忘れがちな部分です。
Michael Peterson

23

UIGestureRecognizerを追加することもできます。ビュー階層に追加の要素を追加する必要はありませんが、かなりシンプルなインターフェイスでタッチイベントを処理するための優れたコードをすべて提供します。

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
    [imgView_ addGestureRecognizer:swipeRight];        
    [swipeRight release];
    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
                                            initWithTarget:self action:@selector(handleSwipe:)];
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [imgView_ addGestureRecognizer:swipeLeft];
    [swipeLeft release];

10
imgView_のUserInteractionEnabledを設定することを忘れないでください
匿名のホワイト

13

私は過去数時間、自分の問題の解決策を見つけようとしてさまざまなスレッドに取り組んできましたが、役に立ちませんでした。多くの開発者がこの問題を共有していることがわかり、ここの人々はこれについて知っていると思います。内に複数の画像がありUIScrollView、タップイベントを取得しようとしています。

からイベントをUIImangeView取得しませんが、UILable設定している非常に類似したパラメーターを使用して、類似のイベントを取得します。IOS 5.1の下で。

私はすでに次のことを行っています:

  1. `UIImageViewと親ビューの両方でsetUserInteractionEnabledをYESに設定します。
  2. setMultipleTouchEnabledをYESに設定しUIImageViewます。
  3. サブクラス化を試みましたがUIImageView、何の助けにもなりませんでした。

以下のいくつかのコードを添付して、このコードではa UIImageViewとの両方を初期化UILabelします。ラベルはイベントの発生という点で問題なく機能します。関係のないコードは除外してみました。みんなありがとう、イラン

UIImageView *single_view = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
single_view.image=img;
single_view.layer.zPosition=4;

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[single_view addGestureRecognizer:singleTap];
[single_view setMultipleTouchEnabled:YES];
[single_view setUserInteractionEnabled:YES];
[self.myScrollView addSubview:single_view];    
self.myScrollView.userInteractionEnabled=YES;

UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
testLabel.backgroundColor=[UIColor redColor];
[self.myScrollView addSubview:testLabel];
[testLabel addGestureRecognizer:singleTap];  
[testLabel setMultipleTouchEnabled:YES];
[testLabel setUserInteractionEnabled:YES];
testLabel.layer.zPosition=4;

そして、イベントを処理するメソッド:

- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{ 
    UIView *tappedView = [gesture.view hitTest:[gesture locationInView:gesture.view] withEvent:nil];
    NSLog(@"Touch event on view: %@",[tappedView class]);
}

前述のように、ラベルタップが受信されます。


6

タッチ可能なUIImageViewを作成してナビゲーションバーに配置する代わりに、UIImageViewから作成するUIBarButtonItemを作成するだけです。

最初に画像ビューを作成します。

UIImageView *yourImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nameOfYourImage.png"]];

次に、イメージビューからbarbuttonアイテムを作成します。

UIBarButtonItem *yourBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:yourImageView];

次に、ナビゲーションボタンにバーボタン項目を追加します。

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

このコードは、ナビゲーションコントローラーのviewcontroller配列内にあるビューコントローラーに入ります。したがって、基本的には、この「タッチ可能な画像のようなバーボタン項目」は、このビューコントローラーが表示されているときにナビゲーションバーにのみ表示されます。別のView Controllerを押すと、このナビゲーションバーのボタンアイテムが消えます〜


3

サブビューを含む(またはサブクラス)のtouchesBegan:withEvent:メソッドをオーバーライドすることをお勧めしUIViewますUIImageView

このメソッド内で、UITouchタッチのいずれかがUIImageViewインスタンスの境界内にあるかどうかをテストします(呼び出されているとしましょうimageView)。

つまり、CGPoint要素は要素と[touch locationInView]交差していCGRectます[imageView bounds]か?CGRectContainsPointこのテストを実行する関数を調べます。


お返事をありがとうございます。次のようなビューを追加しました:[navBar addSubview:self.pImage]; //ナビゲーションバーのサブビューとして追加されます。関数をオーバーライドしましたが、関数が呼び出されることはありません。UIImageViewのプロパティuserInteractionEnabledをYESに設定しました。何か不足していますか?
ebaccount 2009年

touchesBegan:withEvent:メソッドを確認してください。これがどのように機能するかの検索エンジンの例はたくさんあります。
Alex Reynolds、

1

最初にUIButtonを配置してから、このボタンの背景画像を追加するか、ボタンの上にUIImageViewを配置する必要があります。

または

タップジェスチャをUIImageViewに追加して、UIImageViewをタップしたときにクリックアクションを取得できます。


0

この回答に対するSwift 4ソリューションを探している方のために。以下を使用して、UIImageViewのタッチイベントを検出できます。

let gestureRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageViewTapped))
imageView.addGestureRecognizer(gestureRecognizer)
imageView.isUserInteractionEnabled = true

次に、セレクタを次のように定義する必要があります。

@objc func imageViewTapped() {
    // Image has been tapped
}

-2

そのビューにジェスチャーを追加します。そのビューに画像を追加すると、画像に対するジェスチャーも検出されます。タッチイベントのデリゲートメソッドを試してみてください。その場合も検出されます。ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.