ビューベースの 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.");
}
ベストアンサー1
バグがあるようです。許可された方向を指定することはできますが、実際のアクション セレクター メソッドでスワイプをトリガーした方向では、最初に設定したビット マスク (許可された方向用) が引き続き取得されます。
つまり、複数の方向が許可されている場合、実際の方向のチェックは常に失敗します。セレクター メソッドで 'direction' の値を出力すると、これを簡単に確認できます (つまり、-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
)。
Apple にバグレポート (#8276386) を提出しました。
[更新] Apple から、動作は意図したとおりに動作するとの回答を受け取りました。
たとえば、テーブル ビューでは、テーブル ビュー セルを左または右にスワイプして「削除」をトリガーできます (これにより、スワイプ ジェスチャの方向が左と右に設定されます)。
つまり、元の回避策は、本来の使用方法です。方向プロパティは、ジェスチャを正しく認識させるためにのみ使用できますが、認識が成功したときに実行されるメソッドで、認識をトリガーした実際の方向と比較するために使用することはできません。