ナビゲーション バーに画像 (UIImageView) を配置しました。ここで、タッチ イベントを検出し、イベントを処理したいと考えています。どうやってやるの?
10 に答える
実際には、そうしないでください。
代わりに、UIImageViewの上にカスタムスタイルのボタン(画像を指定しない限りボタンのグラフィックはありません)を追加します。次に、呼び出したいメソッドをそれにアタッチします。
この手法は、タッチ機能をいじる代わりに、画面の一部の領域をボタンとして機能させたい場合に使用できます。
AUIImageView
はからUIView
派生してUIResponder
いるので、タッチイベントを処理する準備ができています。、、、およびメソッドを指定するとtouchesBegan
、ユーザーが画像をタップすると呼び出されます。タップイベントだけが必要な場合は、画像をボタン画像として設定したカスタムボタンを使用する方が簡単です。ただし、タップや移動などをよりきめ細かく制御したい場合は、これが最適な方法です。touchesMoved
touchesEnded
また、さらにいくつかのことを確認する必要があります。
ビューがタッチイベントのフォーカスになる可能性があることを示すために、オーバーライド
canBecomeFirstResponder
してYESを返します(デフォルトはNOです)。userInteractionEnabled
プロパティをYESに設定します。デフォルトのforUIViews
はYESですが、forUIImageViews
はNOであるため、明示的にオンにする必要があります。multipleTouchEnabled
マルチタッチイベント(ピンチ、ズームなど)に応答する場合は、[はい]に設定します 。
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];
過去数時間、問題の解決策を見つけようとして別のスレッドに参加していましたが、役に立ちませんでした。多くの開発者がこの問題を共有していることがわかります。ここにいる人々はこのことを知っていると思います。内に複数の画像がありUIScrollView
、タップイベントを取得しようとしています。
からイベントを取得していませんが、設定している非常によく似たパラメーターを持つUIImangeView
同様の からイベントを取得しています。UILable
iOS5.1以下。
私はすでに次のことを行っています:
- `UIImageView と親ビューの両方で setUserInteractionEnabled を YES に設定します。
- の setMultipleTouchEnabled を YES に設定し
UIImageView
ます。 - サブクラス化を試みましたが、何の役
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]);
}
前述のとおり、ラベル タップが受信されます。
タッチ可能な 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を押すと、このナビゲーションバーのボタンアイテムが消えます。
サブビューを含む (またはサブクラス)のtouchesBegan:withEvent:
メソッドをオーバーライドしたい場合があります。UIView
UIImageView
このメソッド内で、UITouch
タッチのいずれかがインスタンスの境界内にあるかどうかをテストしUIImageView
ます (それが呼び出されたとしましょうimageView
)。
つまり、要素はCGPoint
要素[touch locationInView]
と交差していCGRect
ます[imageView bounds]
か? CGRectContainsPoint
このテストを実行する関数を調べます。
まず、UIButton を配置してから、このボタンの背景画像を追加するか、ボタンの上に UIImageView を配置する必要があります。
または:
タップ ジェスチャを UIImageView に追加して、UIImageView をタップしたときにクリック アクションを取得できます。
そのビューにジェスチャーを追加します。そのビューに画像を追加すると、画像上でのジェスチャーも検出されます。touch イベントのデリゲート メソッドを試すことができます。その場合、それも検出している可能性があります。