248
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapTapTap:)];
[self.view1 addGestureRecognizer:tapGesture];
[self.view2 addGestureRecognizer:tapGesture];
[tapGesture release];

上記のコードでは、タップのみview2が認識されます。3行目をコメントアウトすると、タップview1が認識されます。私が正しく、ジェスチャレコグナイザーを1回しか使用できない場合、これがバグなのか、それともさらにドキュメントが必要なのかはわかりません。

4

12 に答える 12

355

AUIGestureRecognizerは単一のビューで使用されます。ドキュメントがむらがあることに同意します。それUIGestureRecognizerはそれを与える単一のviewプロパティを持っています:

見る

ジェスチャ レコグナイザがアタッチされているビュー。(読み取り専用)

@property(nonatomic, readonly) UIView *ビュー

考察 addGestureRecognizer: メソッドを使用して、ジェスチャ認識機能を UIView オブジェクトにアタッチ (または追加) します。

于 2011-04-06T14:07:20.663 に答える
49

以下を使って回避しました。

for (UIButton *aButton in myButtons) {

            UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
            longPress.minimumPressDuration=1.0;
            [aButton addGestureRecognizer:longPress];
            [longPress release];

}

次に、handleLongPressメソッドで、ジェスチャーレコグナイザーのビューと同じUIButtonを設定し、そのボタンに基づいて実行する内容を分岐します。

- (void)handleLongPress:(UILongPressGestureRecognizer*)gesture {
    if ( gesture.state == UIGestureRecognizerStateEnded ) {
        UIButton *whichButton=(UIButton *)[gesture view];
        selectedButton=(UIButton *)[gesture view];
    ....
}
于 2011-10-25T01:59:11.393 に答える
18

誰かがこれを必要とする場合のSwift 3の場合:上記のBhavik Rathod Answerに基づいています。

 func setGestureRecognizer() -> UIPanGestureRecognizer {

        var panRecognizer = UIPanGestureRecognizer()

        panRecognizer = UIPanGestureRecognizer (target: self, action: #selector(pan(panGesture:)))
        panRecognizer.minimumNumberOfTouches = 1
        panRecognizer.maximumNumberOfTouches = 1
        return panRecognizer
    }

        ///set the recognize in multiple views
        view1.addGestureRecognizer(setGestureRecognizer())
        view2.addGestureRecognizer(setGestureRecognizer())
于 2016-11-03T15:33:46.567 に答える
12

We can do something このように簡単でシンプルです

1) コントローラーで以下のように関数を作成します (この関数は GestureRecognizer を返します)

-(UITapGestureRecognizer*)setRecognizer{
     UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openProfile)];
     [gestureRecognizer setNumberOfTapsRequired:1];
     return gestureRecognizer;
}

2) このレコグナイザーを複数のビューに設定する

[self.view1 addGestureRecognizer:[self setRecognizer]]; 
[self.view2 addGestureRecognizer:[self setRecognizer]];
于 2016-09-13T11:04:18.703 に答える
10

いいえ、Gesture Recognizer を複数のビューにアタッチしないでください。

Apple のドキュメントには、次の明示的な情報があります。

Gesture Recognizer がビューにアタッチされている

すべてのジェスチャ レコグナイザーは、1 つのビューに関連付けられています。対照的に、ビューは複数のジェスチャ レコグナイザーを持つことができます。これは、1 つのビューが多くの異なるジェスチャに応答する可能性があるためです。ジェスチャ レコグナイザーが特定のビューで発生したタッチを認識するようにするには、ジェスチャ レコグナイザーをそのビューにアタッチする必要があります。

iOS のイベント処理ガイド - ジェスチャ レコグナイザApple Developer Library

他の人が言及しているように、場合によっては機能する可能性がありますが、それは明らかにドキュメントに反しており、将来の iOS バージョンで変更される可能性があります。

できることは、監視するビューに個別のジェスチャ認識機能を追加することであり、それらは共通のアクションを共有できます。

于 2015-07-07T16:56:20.167 に答える
4

kwalkerが上記で回答したように、複数のボタンにジェスチャービューを追加するためのコードを誰かが望んでおらず、Interface Builderを介してそれを行いたい場合、これは役立つかもしれません。

1) UIButtons や UILabels などの他のオブジェクトを追加するのと同じように、オブジェクト ライブラリから長押しジェスチャ レコグナイザーを追加できます。

ここに画像の説明を入力 最初に私が最終的に使用したのは、1つだけを取ったということでした

2) ファイルの所有者で参照アウトレットUIButtonと送信アクションを設定します。

ここに画像の説明を入力

注: 複数の UIButton またはその他のオブジェクトがある場合は、それぞれに個別のジェスチャ認識エンジンが必要になります。詳細については、この私の質問を参照してください。長押しジェスチャ認識エンジンで間違った UIButton タグを取得する

于 2013-03-20T14:20:24.107 に答える
2

<UIScrollViewDelegate>クラスを ' 'でオーバーライド

.m クラスでこのメソッドを使用します。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}

このメソッドは、単一のビューで複数のスワイプを有効にするのに役立ちます..

于 2015-12-06T07:55:10.237 に答える
2

同じ関数を指すジェスチャ認識エンジンを追加するたびに、GestureRecognize を再書き込み (再作成) するのはどうでしょうか。以下の場合は動作します。IBOutletCollection を使用しています

スウィフト 2:

@IBOutlet var topicView: [UIView]!

override func viewDidLoad() {
        for view in self.topicView as [UIView] {
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "viewClicked:"))
    }
}

func viewClicked(recognizer: UITapGestureRecognizer) {
    print("tap")
}
于 2016-03-21T19:25:20.750 に答える
-7

xibのイメージビューであるこのコード私のビューを使用してそれを行うことができます。

- (void)viewDidLoad
{
    firstIV.tag = 501;
    secondIV.tag = 502;
    thirdIV.tag = 503;
    forthIV.tag = 504;

    [self addTapGesturetoImageView: firstIV];
    [self addTapGesturetoImageView: secondIV];
    [self addTapGesturetoImageView: thirdIV];
    [self addTapGesturetoImageView: forthIV];
}

-(void)addTapGesturetoImageView:(UIImageView*)iv
{
    iv.userInteractionEnabled = YES;
    UITapGestureRecognizer * textfielBGIVTapGasture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textfielBGIVTapped:)];
    textfielBGIVTapGasture.numberOfTapsRequired = 1;
    [iv addGestureRecognizer:textfielBGIVTapGasture];
}

- (void)textfielBGIVTapped:(UITapGestureRecognizer *)recognizer {
    int tag = recognizer.view.tag-500;
    switch (tag) {
        case 1:
        {
            //firstIV tapped;
            break;
        }
        case 2:
        {
            //secondIV tapped;
            break;
        }
        case 3:
        {
            //thirdIV tapped;
            break;
        }
        case 4:
        {
            //forthIV tapped;
            break;
        }
        default: {
            break;
        }
    }
}
于 2013-09-20T10:36:24.710 に答える