web-dev-qa-db-ja.com

UIViewのタッチイベント

動的に作成されたUIViewのタッチを検出するためのサンプルコードはありますか? touchesBeganへの参照をいくつか見つけましたが、それを実装する方法がわかりません...

30
Andrew M

タッチを取得する非常に一般的な方法は、カスタム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 について知っておくと便利です。

82
Tyler

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];
16
Arunjack

UIViewを継承して作成したサブクラスから独自のカスタムUIViewを作成し、サブクラス内で次のメソッドをオーバーライドします。

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

}
5
ThE uSeFuL

Guesture Recongnizerを使用すると、タッチイベントを簡単にキャッチできます。

ストーリーボードのコンポーネントライブラリからゲストを1人見つけます。

enter image description here

たとえば、Tap Gesture Recognizerをビューにドラッグします。ビューUIには表示されません。ストーリーボードの左パネルのドキュメントアウトラインから見つけることができます。

enter image description here

最後の手順は、タッチを監視するデリゲートとしてビューにコントロールドラッグでリンクし、アクションとしてビューコントローラークラスにコントロールドラッグします。リンク接続の写真を次に示します。

enter image description here

およびアクションコード:

@IBAction func tapAction(_ sender: Any) {
    // touch is captured here.
}
3
David.Chu.ca

ジェスチャーを使用してタッチをキャプチャする代わりに、UIView親クラスをUIControlに変更して、touchUpInsideイベントを処理できるようにすることをお勧めします

から:

@interface MyView : UIView

に:

@interface MyView : UIControl

次に、この行をview-

    [self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside]; 

スクロール中にジェスチャーが問題を引き起こす可能性があるためです。

2
Zoeb S

私の方法は、InterfaceBuilder IdentityInspectorでUIViewクラスをUIControlクラスに変更するだけです。その後、ConnectionsInspectorはすぐにフックの準備ができたtouchイベントを持ちます。

ゼロコード変更。

1
DazChong