ナビゲーションバーに画像(UIImageView)を配置しました。ここで、タッチイベントを検出し、イベントを処理したいです。どうすればそれができますか?
ありがとう。
実際には、そうしないでください。
代わりに、UIImageViewにカスタムスタイルのボタンを追加します(画像を指定しない限り、ボタンのグラフィックはありません)。次に、呼び出したいメソッドをアタッチします。
画面の一部の領域を、Touchのものをいじるのではなく、ボタンとして機能させたい多くの場合に、この手法を使用できます。
UIImageView
は、UIView
から派生したUIResponder
から派生しているため、タッチイベントを処理する準備ができています。 touchesBegan
、touchesMoved
、およびtouchesEnded
メソッドを提供すると、ユーザーが画像をタップしたときに呼び出されます。タップイベントだけが必要な場合は、ボタン画像として設定された画像でカスタムボタンを使用する方が簡単です。しかし、タップ、移動などをより細かく制御したい場合は、これが方法です。
また、いくつかのことを確認する必要があります。
canBecomeFirstResponder
をオーバーライドし、ビューをタッチイベントのフォーカスにできることを示すためにYESを返します(デフォルトはNOです)。
userInteractionEnabled
プロパティをYESに設定します。 UIViews
のデフォルトはYESですが、UIImageViews
のデフォルトはNOなので、明示的にオンにする必要があります。
マルチタッチイベント(ピンチ、ズームなど)に応答する場合は、multipleTouchEnabled
をYESに設定します。
UIImageViewにタッチイベントを追加するには、.mで次を使用します
UITapGestureRecognizer *newTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(myTapMethod)];
[myImageView setUserInteractionEnabled:YES];
[myImageView addGestureRecognizer:newTap];
-(void)myTapMethod{
// treat image tap
}
それが役立つことを願っています。
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
からイベントを取得しています。 IOS 5.1の下。
私はすでに以下を行っています:
UIImageView
に対してsetMultipleTouchEnabledをYESに設定します。UIImageView
のサブクラス化を試みましたが、何の助けにもなりませんでした。以下のコードを添付して、このコードで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]);
}
前述のように、ラベルタップが受信されます。
タッチ可能な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をプッシュすると、このナビゲーションバーのボタンアイテムが消えます〜
したいことは、UIView
サブビューを含むUIImageView
(またはサブクラス)のtouchesBegan:withEvent:
メソッドをオーバーライドすることです。
このメソッド内で、UITouch
タッチのいずれかがUIImageView
インスタンスの境界内に収まるかどうかをテストします(たとえば、imageView
と呼ばれます)。
つまり、CGPoint
要素[touch locationInView]
はCGRect
要素[imageView bounds]
と交差しますか?このテストを実行するには、関数CGRectContainsPoint
を調べます。
最初にUIButtonを配置してから、このボタンの背景画像を追加するか、UIImageViewをボタンの上に配置する必要があります。
または
UIImageViewをタップしたときにクリックアクションを取得できるように、タップジェスチャをUIImageViewに追加できます。
この回答の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
}