UISwipeGestureRecognizer
(たとえば、UISwipeGestureRecognizerDirectionRight
とUISwipeGestureRecognizerDirectionLeft
)を使用して、2つの異なるスワイプジェスチャーをキャッチする必要があります。 addGestureRecognizerメソッドを使用して2つの異なる認識機能を追加すると、最後に追加した認識機能のみが機能します。私はgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizerDelegate
プロトコルのメソッドを実装する必要があることを読みましたが、何も機能しません。
誰かが2つ以上の同じジェスチャーをキャッチする簡単な例を手伝ってくれる?ありがとう!
それは本当に簡単でした:
最初に、UIGestureRecognizerDelegate
プロトコルを実装するクラスを作成する必要があります。
@interface MyGestureDelegate : NSObject <UIGestureRecognizerDelegate>
@implementation MyGestureDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return YES;
}
次のように使用します。
UISwipeGestureRecognizer *swipeGestureLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipeGestureLeft:)];
[self.view addGestureRecognizer:swipeGestureLeft];
swipeGestureLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[swipeGestureLeft release];
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipeGesture:)];
swipeGesture.direction = UISwipeGestureRecognizerDirectionRight;
[self.view addGestureRecognizer:swipeGesture];
MyGestureDelegate *deleg = [[MyGestureDelegate alloc] init];
[swipeGesture setDelegate:deleg];
[swipeGesture release];
答え:フェニックスからの「えーと、ドキュメントをざっと見て」は絶対に機能しません。
彼はマスクを設定してから、同じ変数を使用して、認識エンジンがそれをクリアしてシングルビットを設定したかのようにテストしています。彼はドキュメントから正しく引用したように、それを保存します:
スワイプの許可された方向
sender.direction
最初に設定したマスクを返すだけで、彼の例では、単一方向に解決されることはありません!
UISwipeGestureRecognizerDirectionRight == 1
UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft == 3
さらに、ほとんどの場合、次のことは必要ありません。
次は私のために働きます:
UISwipeGestureRecognizer* swipe;
swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeL)] autorelease];
swipe.direction = UISwipeGestureRecognizerDirectionLeft;
[view addGestureRecognizer:swipe];
swipe = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeR)] autorelease];
swipe.direction = UISwipeGestureRecognizerDirectionRight; // default
[view addGestureRecognizer:swipe];
ええと、ドキュメントをざっと見てみると、必要以上に多くの作業を行っていることがわかります。
「方向スワイプの許可された方向。
@property(nonatomic) UISwipeGestureRecognizerDirection direction
説明ビットごとのORオペランドを使用して複数のUISwipeGestureRecognizerDirection
定数を指定することにより、複数の方向を指定できます。デフォルトの方向はUISwipeGestureRecognizerDirectionRight
です。 "
つまり、2つのUISwipeGestureRecognizerを使用する代わりに、次のことを実行できます。
UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipeGesture:)];
swipeGesture.direction = UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft;
そしてあなたのアクションメソッドで:
-(IBAction)handleSwipeGesture:(UISwipeGestureRecognizer*)sender
{
if (sender.direction == UISwipeGestureRecognizerDirectionLeft) {
//do left action
} else {
//do right action
}
}
はるかに単純で、対立する傾向がはるかに少ない。
ジェスチャレコグナイザがジェスチャを認識するために使用する手法について少しお読みになることをお勧めします。おそらく、最初の認識機能はジェスチャーを認識しようとしますが、ジェスチャーに応答する必要がないことに気付き、それから何らかの方法でジェスチャーを伝えません。
それらの使用方法を理解するために、それらがどのように機能するかを読むことは非常に役立ちます。
お役に立てれば。
User294890の提案のおかげで、リストされているUIGestureRecognizerDelegate
メソッドからyesを返すことで成功しました。
ただし、Webビューが読み込まれる前にGestureRecognizerを追加すると機能しないことがわかりました。ただし、webViewデリゲートメソッドでwebViewにGestureRecognizerを追加した場合は機能しました。
- (void)webViewDidFinishLoad:(UIWebView *)webView
。