0

数量を増やすボタンがあり、それをタップするとサービスコールを発信します。問題は、それを複数回タップした場合、それをタップし終えた後にのみサービスコールを発信したいということです。UITapGestureRecognizerを使用してみましたが、タップ数をカウントする方法がわかりません。

どんな助けでもいただければ幸いです。

これがサンプルコードです

- (void)quantityChanged:(UITapGestureRecognizer *)tapRecognizer {
    static NSUInteger numberOfTaps;
    if (tapRecognizer.state == UIGestureRecognizerStateBegan) {
       numberOfTaps = 0;
    }
    if (tapRecognizer.state == UIGestureRecognizerStateEnded)
        NSLog(@"%d",numberOfTaps);
    if (tapRecognizer.state == UIGestureRecognizerStateChanged)
        numberOfTaps++;

}

4

4 に答える 4

4

4つの可能な解決策

あなたの方法は大丈夫だと思います

- (void)quantityChanged:(UITapGestureRecognizer *)tapRecognizer {

    static NSUInteger numberOfTaps;


   if (tapRecognizer.state == UIGestureRecognizerStateEnded) {

        numberOfTaps ++;

        NSLog(@"web service call with %d",numberOfTaps);
    }

}

ログを見る

web service call with 1
web service call with 2
web service call with 3
web service call with 4

また

トリガーした後、quantityChangedUITapGestureRecognizerを削除します

つまり、送信者オブジェクトからUITapGestureRecognizerを削除します(最初のWebサービスの後のquantityChangedメソッド内)

次に、最初のWebサービス応答を受け取った後、UITapGestureRecognizerを送信者に再度追加します。

また

UILongPressGestureRecognizerを使用します。それは長いイベントプロセスです。イベントの状態を開始、完了などで確認し、コードを記述してください。

- (IBAction)longPressDetected:(UIGestureRecognizer *)gestureRecognizer {        

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan){

        NSLog(@"Long press began");

    } else if ( gestureRecognizer.state == UIGestureRecognizerStateRecognized ) {

            NSLog(@"Long press UIGestureRecognizerStateRecognized");
    }
    else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {

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

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

また

UITapGestureRecognizerに必要なnumberOfTapsを設定します

UITapGestureRecognizer *doubleTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(beginComicTransitions:)] autorelease];    
doubleTapRecognizer.numberOfTapsRequired = 2;
doubleTapRecognizer.numberOfTouchesRequired = 1;
doubleTapRecognizer.delegate = self;
于 2012-08-15T06:56:39.630 に答える
1

これが実用的なユーザーインターフェイスにつながるとは思えませんが...ユーザーが「入力」できる最大数がわかっている場合は、- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizerここにドキュメント)。

コードは次のようになります。

-(void)addGestureRecognizers
{
  int maxCount = 10;
  UITapGestureRecognizer *other = nil;
  for(int i = maxCount; i < 0; i--)
  {
    UITapGestureRecognizer *tapper = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapped:)];
    tapper.numberOfTapsRequired = i;
    if(other)
    {
      [tapper requireGestureRecognizerToFail:other]; 
    }
    [self.view addGestureRecognizer:tapper];
    other = tapper;
  }
}

-(void)tapped:(UITapGestureRecognizer *)tapper
{
  [self callWebservice:tapper.numberOfTapsRequired];
}

私はそれをテストしませんでした、それで動作しませんでした、しかしそれは私がドキュメントから理解したことです。

于 2012-08-15T07:39:58.110 に答える
0

Ok。だから私は自分の問題の解決策を見つけました。0.5秒の遅延でWebサービス呼び出しを実行し、ボタンを押すたびに、実行を待機しているすべてのセレクターをキャンセルし、もう一度performSelector:withDelayを呼び出します。

于 2012-08-15T07:34:55.470 に答える
0

UITapGestureOrganizerがなければ、さらに簡単です。

button.addTarget(self, action: #selector(multipleTap(_:event:)), for: UIControlEvents.touchDownRepeat)

その後:

func multipleTap(_ sender: UIButton, event: UIEvent) {
    let touch: UITouch = event.allTouches!.first!
    if touch.tapCount == 3 {
        print("triple tap")
    }
}
于 2018-11-21T09:36:13.177 に答える