【问题标题】:Count number of taps with UITapGestureRecognizer使用 UITapGestureRecognizer 计算点击次数
【发布时间】:2012-08-11 12:05:39
【问题描述】:

我有一个增加数量的按钮,当我点击它时,我会拨打服务电话。问题是,如果我多次点击它,我只想在完成点击后拨打服务电话。我尝试使用 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++;

}

【问题讨论】:

  • 对于用户界面来说听起来有点像一个奇怪的想法 - 但也许我没有明白。您是否想要一个用户点击(快速)的按钮,如果一段时间内没有其他点击,它需要点击次数并以点击次数为参数调用其他方法?
  • 是的,关键是我不想每次点击都调用web服务,而是统计点击次数,并在调用web服务时相应更改数量。
  • @Cosmin 也是我的用例。我最终使用了 performSelector:withObject:afterDelay 和 cancelPreviousPerformRequestsWithTarget 方法

标签: iphone ios uibutton uitapgesturerecognizer


【解决方案1】:

四种可能的解决方案

我觉得你的方法很好

- (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

在触发后删除 quantityChanged UITapGestureRecognizer

我的意思是,从发件人对象中删除 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 设置 numberOfTapsRequired

UITapGestureRecognizer *doubleTapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(beginComicTransitions:)] autorelease];    
doubleTapRecognizer.numberOfTapsRequired = 2;
doubleTapRecognizer.numberOfTouchesRequired = 1;
doubleTapRecognizer.delegate = self;

【讨论】:

  • 你没有理解我的问题。我想计算我的 UIButton 上的点击次数。如果按钮被点击至少两次,使用你所说的只会触发我的选择器。这不是我需要的。
  • 请好好描述一句“问题是如果我多次点击它,我只想在我完成点击后拨打服务电话。”。那么我们可以帮助你..任何示例代码..?
  • 是的,关键是我不想每次点击都调用web服务,而是统计点击次数,并在调用web服务时相应更改数量。
  • 所以你的意思是,数量是你的网络服务调用的参数?我的意思是当点击第一个 - 使用 1 的网络服务调用时,点击第二个 - 使用 2 的网络服务调用时等等??
  • 是的,所以为了只调用一次网络服务,我想计算点击次数,只有在点击“结束”时才调用
【解决方案2】:

尽管我怀疑这会带来一个实用的用户界面......如果您知道用户可以“输入”的最大计数,您可以使用几个轻击手势侦听器,您可以让每个侦听器依赖于每个其他与- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer (doc here)。

代码可能如下所示:

-(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];
}

我没有对其进行测试,也从未使用过它,但这是我从文档中了解到的。

【讨论】:

    【解决方案3】:

    好的。所以我找到了解决我的问题的方法。我将以 0.5 秒的延迟执行我的 Web 服务调用,每次按下按钮时,我都会取消所有等待执行的选择器并再次调用 performSelector: withDelay。

    【讨论】:

      【解决方案4】:

      没有 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")
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多