98

ナビゲーション バーに画像 (UIImageView) を配置しました。ここで、タッチ イベントを検出し、イベントを処理したいと考えています。どうやってやるの?

4

10 に答える 10

138

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

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

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

于 2009-05-13T06:44:53.543 に答える
115

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

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

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

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

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

于 2009-05-13T01:32:03.203 に答える
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];
于 2011-08-09T14:00:11.140 に答える
13

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

からイベントを取得していませんが、設定している非常によく似たパラメーターを持つUIImangeView同様の からイベントを取得しています。UILableiOS5.1以下。

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

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

以下にいくつかのコードを添付します。このコードでは、 aUIImageViewとの両方を初期化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]);
}

前述のとおり、ラベル タップが受信されます。

于 2012-07-23T10:15:08.367 に答える
6

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

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

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

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

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

次に、バー ボタン アイテムをナビゲーション バーに追加します。

self.navigationItem.rightBarButtonItem = yourBarButtonItem;

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

于 2010-04-23T05:31:34.550 に答える
3

サブビューを含む (またはサブクラス)のtouchesBegan:withEvent:メソッドをオーバーライドしたい場合があります。UIViewUIImageView

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

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

于 2009-05-12T23:32:27.773 に答える
1

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

または:

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

于 2015-07-14T05:16:10.097 に答える
-2

そのビューにジェスチャーを追加します。そのビューに画像を追加すると、画像上でのジェスチャーも検出されます。touch イベントのデリゲート メソッドを試すことができます。その場合、それも検出している可能性があります。

于 2012-07-25T09:24:48.993 に答える