動的に作成されたUIViewのタッチを検出するためのサンプルコードはありますか? touchesBeganへの参照をいくつか見つけましたが、それを実装する方法がわかりません...
タッチを取得する非常に一般的な方法は、カスタムUIViewサブクラスでこれらのメソッドをオーバーライドすることです。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
これらのメソッドの公式ドキュメントは、Responding to Touch Events in the UIResponder class docs (UIResponderのサブクラスであるため、UIViewはこれらのメソッドを継承します)の下にあります。より長くより入門的なドキュメントは、 iOS のイベント処理ガイドにあります。
タップ(タッチダウン、ビュー内のタッチアップ)を検出する場合は、UIButton
をビューのサブビューとして追加し、独自のカスタムメソッドをターゲット/そのボタンのアクションペア。カスタムボタンはデフォルトでは非表示であるため、ビューの外観には影響しません。
より高度なインタラクションを探している場合は、 UIGestureRecognizer
class について知っておくと便利です。
UIViewでUIAnimationを使用してタッチイベントを作成すると、UIViewのタッチをどこでも管理できます。
次のコード:self.finalScoreはUIViewで、cupはUIImageViewです。私が扱う
uIImageViewのタッチイベント、UIView内に存在します。
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
CGRect startRect = [[[cup layer] presentationLayer] frame];
CGRectContainsPoint(startRect, touchLocation);
[UIView animateWithDuration:0.7
delay:0.0
options:UIViewAnimationCurveEaseOut
animations:^{cup.transform = CGAffineTransformMakeScale(1.25, 0.75);}
completion:^(BOOL finished) {
[UIView animateWithDuration:2.0
delay:2.0
options:0
animations:^{cup.alpha = 0.0;}
completion:^(BOOL finished) {
[cup removeFromSuperview];
cup = nil;}];
}];
}
UITapGestureRecognizerのように、UIViewのタッチイベントを処理する別の方法です。
UITapGestureRecognizer *touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(releaseButAction)] autorelease];
// Set required taps and number of touches
[touchOnView setNumberOfTapsRequired:1];
[touchOnView setNumberOfTouchesRequired:1];
// Add the gesture to the view
[[self view] addGestureRecognizer:touchOnView];
UIView
を継承して作成したサブクラスから独自のカスタムUIView
を作成し、サブクラス内で次のメソッドをオーバーライドします。
(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
}
Guesture Recongnizerを使用すると、タッチイベントを簡単にキャッチできます。
ストーリーボードのコンポーネントライブラリからゲストを1人見つけます。
たとえば、Tap Gesture Recognizerをビューにドラッグします。ビューUIには表示されません。ストーリーボードの左パネルのドキュメントアウトラインから見つけることができます。
最後の手順は、タッチを監視するデリゲートとしてビューにコントロールドラッグでリンクし、アクションとしてビューコントローラークラスにコントロールドラッグします。リンク接続の写真を次に示します。
およびアクションコード:
@IBAction func tapAction(_ sender: Any) {
// touch is captured here.
}
ジェスチャーを使用してタッチをキャプチャする代わりに、UIView親クラスをUIControlに変更して、touchUpInsideイベントを処理できるようにすることをお勧めします
から:
@interface MyView : UIView
に:
@interface MyView : UIControl
次に、この行をview-
[self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside];
スクロール中にジェスチャーが問題を引き起こす可能性があるためです。
私の方法は、InterfaceBuilder IdentityInspectorでUIView
クラスをUIControl
クラスに変更するだけです。その後、ConnectionsInspectorはすぐにフックの準備ができたtouchイベントを持ちます。
ゼロコード変更。