ナビゲーションバーに画像(UIImageView)を配置しました。ここで、タッチイベントを検出して、イベントを処理したいと思います。どうすればそれができるのか教えていただけませんか。
ありがとう。
ナビゲーションバーに画像(UIImageView)を配置しました。ここで、タッチイベントを検出して、イベントを処理したいと思います。どうすればそれができるのか教えていただけませんか。
ありがとう。
回答:
実際には、そうしないでください。
代わりに、UIImageViewを介してカスタムスタイルのボタン(画像を指定しない限りボタングラフィックはありません)を追加します。次に、呼び出したいメソッドをそれにアタッチします。
この手法は、タッチの要素をいじるのではなく、画面の一部の領域をボタンとして機能させたい場合に多く使用できます。
AがUIImageView
由来さUIView
から誘導されUIResponder
、それはタッチイベントを処理する準備ができていますので。あなたは提供したいと思うtouchesBegan
、touchesMoved
とtouchesEnded
方法を、ユーザーが画像をタップすると、彼らは呼び出されますよ。必要なのがタップイベントだけの場合は、画像をボタン画像として設定したカスタムボタンを使用する方が簡単です。しかし、タップや移動などをより細かく制御したい場合は、この方法が適しています。
また、さらにいくつかのことを確認する必要があります。
canBecomeFirstResponder
YESをオーバーライドして返し、ビューがタッチイベントのフォーカスになることを示します(デフォルトはNO)。
userInteractionEnabled
プロパティをYESに設定します。のデフォルトUIViews
はYESですが、for UIImageViews
はNOなので、明示的にオンにする必要があります。
マルチタッチイベント(ピンチ、ズームなど)に応答する場合はmultipleTouchEnabled
、YES に設定 します。
userInteractionEnabled
、親ビューでYESに設定して修正しました。stackoverflow.com/questions/5887305/…を
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
ます。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]);
}
前述のように、ラベルタップが受信されます。
タッチ可能な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を押すと、このナビゲーションバーのボタンアイテムが消えます〜
サブビューを含む(またはサブクラス)のtouchesBegan:withEvent:
メソッドをオーバーライドすることをお勧めしUIView
ますUIImageView
。
このメソッド内で、UITouch
タッチのいずれかがUIImageView
インスタンスの境界内にあるかどうかをテストします(呼び出されているとしましょうimageView
)。
つまり、CGPoint
要素は要素と[touch locationInView]
交差していCGRect
ます[imageView bounds]
か?CGRectContainsPoint
このテストを実行する関数を調べます。
この回答に対する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
}
そのビューにジェスチャーを追加します。そのビューに画像を追加すると、画像に対するジェスチャーも検出されます。タッチイベントのデリゲートメソッドを試してみてください。その場合も検出されます。ありがとう