2011-09-07 12 views
5

私は基本的なように思えるかもしれない質問がありますが、それを理解することはできません。認識後にUIGestureRecognizerを失敗させる方法はありますか?

基本的な質問は:どのように私はプログラムでUIGestureRecognizerStateBeganまたはUIGestureRecognizerStateChangedにある間、ジェスチャー認識機能をハンドラーから失敗状態にするのですか?

より詳細な説明:私はUIScrollViewの内部UIViewのための長押しジェスチャー認識を持っています。私が作った

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

私はスクロールビューを取得することはできませんので、ユーザーがビューに自分の指を置くとスクロールすることができないためです。 Safariのような基本的なタッチです。リンク上に指を置いてリンクを強調表示しますが、上または下にスクロールしてリンクを解除し、スクロールビューを動かします。

両方のジェスチャーが認識されているので、これは主に動作しますが、長押しジェスチャーレコグナイザーのStateChangedで動きを検出できれば、20ピクセル以上あればプログラムでlongpressが失敗します。

これは可能ですか?または私は間違った場所で掘っていますか?

答えて

4

私が質問を投稿した直後に見つかったもう一つの問題は...

は、ここで私は今、ジェスチャー認識ハンドラで行うものです:

else if (sender.state == UIGestureRecognizerStateChanged) { 
    CGPoint newTouchPoint = [sender locationInView:[self superview]]; 

    CGFloat dx = newTouchPoint.x - initTouchPoint.x; 
    CGFloat dy = newTouchPoint.y - initTouchPoint.y; 
    if (sqrt(dx*dx + dy*dy) > 25.0) { 
     sender.enabled = NO; 
     sender.enabled = YES; 
    } 
} 

ので、指がどの方向にも25個の以上のピクセルを移動した場合enabledプロパティをNOに設定すると、レコグナイザは失敗します。これは私が欲しいものを達成するでしょう!

4

それはUILongPressGestureRecognizerある場合は、単にそのallowableMovementプロパティを設定します。あなたはジェスチャー認識器をサブクラス化することができますドキュメントによると

UILongPressGestureRecognizer* recognizer = [your recognizer]; 
recognizer.allowableMovement = 25.0f; 
1

:YourPanGestureRecognizer.mで

:YourPanGestureRecognizer.hで

#import "YourPanGestureRecognizer.h" 

@implementation YourPanGestureRecognizer 

- (void) cancelGesture { 
    self.state=UIGestureRecognizerStateCancelled; 
} 

@end 

#import <UIKit/UIKit.h> 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface NPPanGestureRecognizer: UIPanGestureRecognizer 

- (void) cancelGesture; 

@end 

今、あなたは呼び出すことができますどこからでも

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; 
[self.view addGestureRecognizer:panRecognizer]; 
[...] 
-(void) panMoved:(YourPanGestureRecognizer*)sender { 
    [sender cancelGesture]; // This will be called twice 
} 

Ref:https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc

関連する問題