2012-03-13 17 views
6

私はUILongPressGestureRecognizerクラスを使用して、1つのアイテムが選択されている場合に処理します。UILongPressGestureRecognizerは止まることなくハンドルを停止します

ロジックは次のとおりです。ユーザが項目を1秒間押す(UIViewサブクラス)。ジェスチャーが検出されると、項目は強調表示され、移動可能になります。

ユーザーは、このアイテムをタッチすることなく画面全体に移動する必要があります。

私が直面している問題は、動きを整理するためにアイテムクラスに必要な、ジェスチャー認識されたシャドウtouchesBegan/Move/Endedです。

一度認識されたジェスチャーと選択されたアイテムを削除しようとしました。しかし、まだジェスチャーのハンドルにメッセージを送信するのではなく、メソッドにコールを渡します。

誰でも、画面の指を離さずにジェスチャ認識機能を「聴いて」いることを知ることはできますか?

ありがとうございました。ここで

コード:

-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [self removeGestureRecognizer:[self.gestureRecognizers objectAtIndex:0]]; 

     NSLog(@"Long press detected."); 
    } 
} 

あなたが他の枝にデリゲートの呼び出しを見ることができるように、選択したとして、この項目をマークし、直後の認識機能を削除するために、すべての手続きができます。

私が紛失していることはありますか?

- EDIT_

完了!これは動作します:

#pragma mark Gesture Functions 
-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     NSLog(@"Long press detected."); 

     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [sender removeTarget:self action:@selector(handleLongPress:)]; 
     sender.enabled = NO; 
     [self removeGestureRecognizer:sender]; 



    } 
} 

よろしく!

答えて

1

私の考えには2つの解決策があります。 UIViewのアニメーションのための

  1. 、UIViewクラスから継承し、(タッチデリゲートは現在のクラスでトリガされていない場合)の代わりに、アニメーションを処理するためにGusturesを書くのタッチデリゲートを実装している新しいクラスを書いてください。

2.私はUILongPressGestureRecognizerを1回トリガして正常に削除しました。

以下のコードを参照してくださいあなたは、私が

を行っている

手順任意のクエリを持っている場合と、メインビューのロード私は私のメインビューに「MYVIEW」としてのUIViewを追加している私を.ask 。

私は、タップしたビューとメインビューのサブビューを区別するために、myViewにタグを与えました(1,2,3 ...など)。

UILongPressGestureRecognizerジェスチャーをmyViewに割り当て、ターゲットを「moveMe」メソッドとして割り当てました。

ユーザーがmyViewを長押しすると、「moveMe」メソッドがトリガーされます。

は、それから私は、条件タグ== 1

とMAINVIEWサブビューを繰り返し、私たちはタグ付き1メインビュー・サブビューがMYVIEWであることを知ることができるsubview.AsからUILongPressGestureRecognizerを削除しました。

NSLog(@ "ジェスチャーが削除されました")。とNSLog(@ "moveMe");一度にコンソールにのみログインします。

NSLog(@ "touchesBegan"); 「moveMe」メソッドをトリガーする代わりに、最初にトリガーされます。

NSLog(@ "touchesBegan");ジェスチャーを削除した後に常にトリガーします。 "moveMe"メソッドは今までトリガされません。カスタムUIViewクラスは、独自のタッチ処理コードを

コード

- (void)viewDidLoad {  
     //Adding to UIView to main view when application is loading. 
     UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];   
     myView.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 
      myView.tag = 1; //adding a tag to identify it. 
     //Adding Long Press Gesture to the UIView. 
     UILongPressGestureRecognizer *myGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveMe:)]; 
     [myView addGestureRecognizer:myGesture]; 
     [myGesture release]; 
     myGesture = nil; 
     [self.view addSubview:myView]; 
     [myView release]; 
     myView = nil;  
     [super viewDidLoad]; 
    }  

    //Method to trigger when user pressed long on the added UIView. 

-(void)moveMe:(id)sender 
{ 
     for (UIView *subViews in [self.view subviews]) 
     { 
      if (subViews.tag == 1) { 
       [subViews removeGestureRecognizer:sender]; 
       NSLog(@"gesture removed"); 
      }  
     }  
     NSLog(@"moveMe"); 
    }  
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touchesBegan"); 
} 

またはDisable gesture recognizer iOS

+0

詳細について質問してください。 –

+0

送信側のメソッドをパラメータとして削除しようとしましたが、まだ動作していません。 – NemeSys

+0

私は自分の答えを編集しました... –

4

を参照してくださいを持っていますか?そうでない場合は、UILongPressGestureRecognizerallowableMovementプロパティをCGFLOAT_MAXまたはそれ以上の大きい番号に設定し、ジェスチャ更新コールバックを使用してカスタムビューをドラッグします。スーパービューで- (CGPoint)locationInView:(UIView *)viewメソッドを使用して置換を取得し、その位置を認識プログラムの開始時と比較することができます。

+1

+1これは最も簡単な解決策です。基本的には、「ジェスチャ認識プログラムを使用している場合は、ジェスチャ認識プログラムを使用します。 – NJones

+1

'allowableMovement'プロパティを変更する必要はありません。これは失敗のテストにのみ使用されます。 'UILongPressGestureRecognizer.h'のコメントから"ジェスチャーが失敗する前に許容されるピクセル単位の最大動き。一度認識されると(minimumPressDurationの後)、タッチトラッキングの残りの部分については指の動きに制限はありません。 " – NJones

+0

こんにちは、 。 UIViewサブクラスは、スーパービューのサイズと位置を操作するためにtouchesBegan/Moved/Endedを実装しています。ジェスチャーの使用は、すべての項目に触れる感応度を低くする必要から来ています。現時点では、私はジェスチャー認識オブジェクトを無効にするソリューションを使用しており、魅力的に機能しています。 – NemeSys

関連する問題