web-dev-qa-db-ja.com

UIImageViewのタッチイベントをどのように検出できますか

ナビゲーションバーに画像(UIImageView)を配置しました。ここで、タッチイベントを検出し、イベントを処理したいです。どうすればそれができますか?

ありがとう。

97
ebaccount

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

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

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

UIImageViewは、UIViewから派生したUIResponderから派生しているため、タッチイベントを処理する準備ができています。 touchesBegantouchesMoved、およびtouchesEndedメソッドを提供すると、ユーザーが画像をタップしたときに呼び出されます。タップイベントだけが必要な場合は、ボタン画像として設定された画像でカスタムボタンを使用する方が簡単です。しかし、タップ、移動などをより細かく制御したい場合は、これが方法です。

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

  • canBecomeFirstResponderをオーバーライドし、ビューをタッチイベントのフォーカスにできることを示すためにYESを返します(デフォルトはNOです)。

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

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

115
Ramin

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

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

[myImageView setUserInteractionEnabled:YES];

[myImageView addGestureRecognizer:newTap];


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

それが役立つことを願っています。

50
Yup.

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

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

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

私はすでに以下を行っています:

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

以下のコードを添付して、このコードでUIImageViewUILabelの両方を初期化すると、ラベルはイベントの発生に関して正常に機能します。無関係なコードを排除しようとしました。ありがとう、イラン

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

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

13
ilan

タッチ可能なUIImageViewを作成してからnavbarに配置する代わりに、UIImageViewから作成するUIBarButtonItemを作成するだけです。

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

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

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

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

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

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

このコードは、Navigation ControllerのViewController配列内にあるView Controllerに送られることに注意してください。したがって、基本的に、この「タッチ可能な画像表示バーボタンアイテム」は、このView Controllerが表示されているときにのみナビゲーションバーに表示されます。別のView Controllerをプッシュすると、このナビゲーションバーのボタンアイテムが消えます〜

6
yujean

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

このメソッド内で、UITouchタッチのいずれかがUIImageViewインスタンスの境界内に収まるかどうかをテストします(たとえば、imageViewと呼ばれます)。

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

3
Alex Reynolds

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

または

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

1
Hilaj

この回答の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
}
0
Josh