ここで何かが足りないかもしれませんが...
私にはUIView
数人の子供がいます(数人UILabel
のとUIImageView
)。ユーザーが親内の任意の場所(またはその子のUIView
一部)をクリック(タップ)したときにイベントをキャッチする必要があります。UIView
これを行うための最良の方法は何ですか?
ここで何かが足りないかもしれませんが...
私にはUIView
数人の子供がいます(数人UILabel
のとUIImageView
)。ユーザーが親内の任意の場所(またはその子のUIView
一部)をクリック(タップ)したときにイベントをキャッチする必要があります。UIView
これを行うための最良の方法は何ですか?
Identity InspectorでUIViewのクラスを変更できます...それUIControl
を作成してから、ビューのイベントを追加しUITouchUpInside
て、ビューのタップをキャッチできます。
幸運を!
編集:スクリーンショットのステップバイステップは次のとおりです。
景色...
...もちろん、イベントはありません。
戻って、UIControlを使用してUIViewを変更します...
タダー!イベント!
メソッドをUITouchUpInsideイベントにフックします
これは、インターフェイスファイルでどのように表示されるかを示しています
これは、実装ファイルでどのように表示されるかを示しています(もちろん、ログを必要なものに置き換えることができます)
親ビューのジェスチャ認識機能を使用し、子供が独自のジェスチャ認識機能を持たないようにすることで、この動作を装うことができます。UIView
これを行うには、タップをリッスンするジェスチャ認識機能を親に追加します。parentView
子ビュー(UILabels
/ UIImageView
)の包含ビューはどこにあり、handleTap
によって実装されるメソッドは次のparentView
ようになります。
UIGestureRecognizer *tapParent = [[UITapGestureRecognizer alloc]initWithTarget:parentView action:@selector(handleTap)];
[parentView addGestureRecognizer:tapParent];
[tapParent release];
子ビューには独自のジェスチャ認識機能がないため、ジェスチャを「食べる」ことはなく、その範囲内でタップしている限り、親ビューは応答します。
複数のオプションがあるため、もう少し詳細を説明する必要があります。
通常のタップが必要な場合は、標準のタッチイベントの1つをキャッチして、どのサブビューがイベントを取得したかを確認できます。このようなもの:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if(touch.view != self.mySubViewOfInterest)
{
// perform my actions
}
}
複雑なジェスチャ認識が必要な場合は、UIGestureRecognizerのいずれかを使用して、サブビューまたはメインビューに割り当てることができます。
とにかく、すべてのサブビュー(イベントをキャッチするサブビュー)でユーザーインタラクションを有効にする必要があることに注意する必要があります。そうしないと、メインビューでサブビューのイベントもキャプチャされ、何を理解せずにデバッグとデバッグが行われることになります。起こっている。
これは私のために働く
スウィフト3
let gesture = UITapGestureRecognizer(target: self, action: selector(self.customViewClick))
withSender: self)
customView.addGestureRecognizer(gesture)
func customViewClick() {
print("custom view clicked!")
}
スウィフト4:
let clickGesture = UITapGestureRecognizer(target: self, action: #selector(self.onUiViewClick))
uiView.addGestureRecognizer(clickGesture)
@objc func onUiViewClick(sender : UITapGestureRecognizer) {
}