Iphone SDK の同時ジェスチャ認識機能
-
26-09-2019 - |
質問
を使用して 2 つの異なるスワイプ ジェスチャをキャッチする必要があります UISwipeGestureRecognizer
(例えば、 UISwipeGestureRecognizerDirectionRight
そして UISwipeGestureRecognizerDirectionLeft
)。2 つの異なる認識エンジンを追加すると、 addGestureRecognizer このメソッドでは、最後に追加された認識エンジンのみが機能します。実装する必要があると読みました GestureRecognizer:GestureRecognizer と同時に認識する必要があります: の方法 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];
他のヒント
答え:Phoenix からの「えーっと、ドキュメントをざっと見てみましょう...」は絶対に機能しません。
彼はマスクを設定し、同じ変数を使用して、認識エンジンがマスクをクリアして単一ビットを設定したかのようにテストします。彼がドキュメントから正しく引用したように、次のように保存されます。
許可されるスワイプ方向
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
ディスカッション複数を指定することにより、複数の方向を指定できます UISwipeGestureRecognizerDirection
ビットごとの OR オペランドを使用する定数。デフォルトの方向は、 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 の提案のおかげで、リストされたリストから Yes を返すことで成功しました。 UIGestureRecognizerDelegate
方法。
ただし、Web ビューが読み込まれる前に GestureRecognizer を追加すると機能しないことがわかりました。ただし、webView デリゲート メソッドで WebView に GestureRecognizer を追加すると機能しました。
- (void)webViewDidFinishLoad:(UIWebView *)webView
.