131

ビューベースの iPhone プロジェクトに単純なスワイプ ジェスチャ認識を追加したいと考えています。すべての方向 (右、下、左、上) のジェスチャーが認識される必要があります。

UISwipeGestureRecognizer のドキュメントに記載されています。

ビットごとの OR オペランドを使用して複数の UISwipeGestureRecognizerDirection 定数を指定することにより、複数の方向を指定できます。デフォルトの方向は UISwipeGestureRecognizerDirectionRight です。

しかし、私にとってはうまくいきません。4 つの方向すべてを OR すると、左右のスワイプのみが認識されます。

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release]; 
    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}

ビューに4つの認識機能を追加してこれを修正しましたが、ドキュメントで宣伝されているように機能しなかった理由を知りたいですか?

- (void)viewDidLoad {
    UISwipeGestureRecognizer *recognizer;

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    [recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    [[self view] addGestureRecognizer:recognizer];
    [recognizer release];

    [super viewDidLoad];
}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
    NSLog(@"Swipe received.");
}
4

12 に答える 12

115

バグがあるようです。許可された方向を指定できます。ただし、アクション セレクター メソッドでスワイプをトリガーした実際の方向にアクセスしようとすると、(許可された方向に対して) 最初に設定したビット マスクが引き続き取得されます。

つまり、複数の方向が許可されている場合、実際の方向のチェックは常に失敗します。セレクターメソッド(つまり )で「方向」の値を出力すると、非常に簡単に確認できます-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer

Apple にバグ レポート (#8276386) を提出しました。

[更新] Apple から、意図したとおりに動作するという回答がありました。

たとえば、テーブル ビューでは、テーブル ビュー セル内で左右にスワイプして「削除」をトリガーできます (これにより、スワイプ ジェスチャの方向が左右に設定されます)。

これは、元の回避策が本来の使用方法であることを意味します。方向プロパティは、ジェスチャを正しく認識させるためにのみ使用できますが、認識が成功したときに実行されるメソッドでは、認識をトリガーした実際の方向を比較するために使用できません。

于 2010-08-05T13:52:19.087 に答える
25

左/右ジェスチャと上/下ジェスチャがペアで連携して動作することに気付きました。そのため、2 つのジェスチャ レコグナイザを指定するだけで済みます。そして、ドキュメントは間違っているようです。

于 2010-07-28T22:02:40.837 に答える
22

残念ながら、ラースが言及したような2つのジェスチャーを追加することで問題を解決し、それは完璧に機能しました...

1)左/右2)上/下

  

UISwipeGestureRecognizer *swipeLeftRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeLeftRight setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft )];
    [self.view addGestureRecognizer:swipeLeftRight];

    UISwipeGestureRecognizer *swipeUpDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
    [swipeUpDown setDirection:(UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown )];
    [self.view addGestureRecognizer:swipeUpDown];
于 2011-12-23T10:32:21.403 に答える
13
UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];

これが didSwipe 関数です

- (void) didSwipe:(UISwipeGestureRecognizer *)recognizer{
      if([recognizer direction] == UISwipeGestureRecognizerDirectionLeft){
          //Swipe from right to left
          //Do your functions here
      }else{
          //Swipe from left to right
          //Do your functions here
      }
 }
于 2012-09-18T08:05:07.070 に答える
5

4 つの方向すべてを検出する場合は、回避策で行ったように、4 つのインスタンスを作成する必要があります。

理由: 作成する UISwipeGestureRecognizer の同じインスタンスが、送信者としてセレクターに渡されるインスタンスです。したがって、4 つの方向すべてを認識するように設定するとsgr.direction == xxx、xxx が 4 つの方向のいずれかである場合に true が返されます。

これは、より少ないコードを含む代替の回避策です (ARCの使用を想定しています)。

for(int d = UISwipeGestureRecognizerDirectionRight; d <= UISwipeGestureRecognizerDirectionDown; d = d*2) {
    UISwipeGestureRecognizer *sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
    sgr.direction = d;
    [self.view addGestureRecognizer:sgr];
}
于 2012-07-24T20:11:04.533 に答える
5

Xcode 4.2 を使用している場合は、Gesture Recognizers @ ストーリーボードを追加してから、GUI Gesture Recognizer を IBActions にリンクできます。

Gesture Recognizer は、ユーティリティ ペイン (右ペインの下部) のオブジェクト ライブラリにあります。

次に、適切なアクションに Control キーを押しながらドラッグするだけです。

于 2012-01-11T23:17:57.803 に答える
2
UISwipeGestureRecognizer *Updown=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            Updown.delegate=self;
            [Updown setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp];
            [overLayView addGestureRecognizer:Updown];

            UISwipeGestureRecognizer *LeftRight=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleGestureNext:)];
            LeftRight.delegate=self;
            [LeftRight setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight];
            [overLayView addGestureRecognizer:LeftRight];
            overLayView.userInteractionEnabled=NO;


    -(void)handleGestureNext:(UISwipeGestureRecognizer *)recognizer
    {
        NSLog(@"Swipe Recevied");
        //Left
        //Right
        //Top
        //Bottom
    }
于 2014-09-22T12:21:17.303 に答える
2

UISwipeGestureRecognizer を使用するためのコード サンプルを次に示します。コメントに注意してください。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //add gesture recognizer. The 'direction' property of UISwipeGestureRecognizer only sets the allowable directions. It does not return to the user the direction that was actaully swiped. Must set up separate gesture recognizers to handle the specific directions for which I want an outcome.
    UISwipeGestureRecognizer *gestureRight;
    UISwipeGestureRecognizer *gestureLeft;
    gestureRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRight:)];//direction is set by default.
    gestureLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];//need to set direction.
    [gestureLeft setDirection:(UISwipeGestureRecognizerDirectionLeft)];
    //[gesture setNumberOfTouchesRequired:1];//default is 1
    [[self view] addGestureRecognizer:gestureRight];//this gets things rolling.
    [[self view] addGestureRecognizer:gestureLeft];//this gets things rolling.
}

swipeRight と swipeLeft は、左右のスワイプに基づいて特定のアクティビティを実行するために使用するメソッドです。例えば:

- (void)swipeRight:(UISwipeGestureRecognizer *)gesture
{
    NSLog(@"Right Swipe received.");//Lets you know this method was called by gesture recognizer.
    NSLog(@"Direction is: %i", gesture.direction);//Lets you know the numeric value of the gesture direction for confirmation (1=right).
    //only interested in gesture if gesture state == changed or ended (From Paul Hegarty @ standford U
    if ((gesture.state == UIGestureRecognizerStateChanged) ||
    (gesture.state == UIGestureRecognizerStateEnded)) {

    //do something for a right swipe gesture.
    }
}
于 2012-06-28T21:39:53.457 に答える
1

これを使用してください、それはビット操作でなければなりません

   gesture.direction & UISwipeGestureRecognizerDirectionUp || 
   gesture.direction & UISwipeGestureRecognizerDirectionDown
于 2012-03-14T04:13:45.700 に答える
1

うーん、奇妙な、それは私にとって完璧に機能します、私はまったく同じことをします

見てみるべきだと思います

UIGestureRecognizerDelegate メソッド

- (BOOL)gestureRecognizerShouldBegin:(UISwipeGestureRecognizer *)gestureRecognizer {
   // also try to look what's wrong with gesture
   NSLog(@"should began gesture %@", gestureRecognizer);
   return YES;
}

ログには次のようなものが表示されます。

ジェスチャーを開始する必要があります。target= <(action=actionForUpDownSwipeGestureRecognizer:, target=)>; 方向 = 上、下、左、右>

于 2011-09-05T23:16:32.047 に答える
0

これは私を夢中にさせていました。複数の swipeGestureRecognizer を持つ信頼できる方法をついに見つけました。

「アクション」セレクターの名前が複数の swipeGestureRecognizer で同じ場合、iOS にバグがあるようです。たとえば、handleLeftSwipeFrom と handleRightSwipeFrom のように別の名前を付ければ、すべてが機能します。

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
于 2012-10-24T20:41:00.950 に答える