Iphone 有可能区分长按和轻敲按钮吗?

Iphone 有可能区分长按和轻敲按钮吗?,iphone,cocoa-touch,uiview,uibutton,Iphone,Cocoa Touch,Uiview,Uibutton,我们可以调用不同的操作/委托来响应两个不同的事件吗 轻敲按钮 点击并按住按钮 ?我能想到的最好的解决方案是创建另一个类和UIButton子类。然后在Interface Builder上(如果您使用的是Interface Builder),可以将按钮的类设置为刚刚创建的自定义类 因此,在这个新类中,必须重写一个名为 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 这基本上是告诉你有人按下了你的按钮。触摸是一个NSS

我们可以调用不同的操作/委托来响应两个不同的事件吗

  • 轻敲按钮
  • 点击并按住按钮

  • 我能想到的最好的解决方案是创建另一个类和UIButton子类。然后在Interface Builder上(如果您使用的是Interface Builder),可以将按钮的类设置为刚刚创建的自定义类

    因此,在这个新类中,必须重写一个名为

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    
    这基本上是告诉你有人按下了你的按钮。触摸是一个NSSet,它保存所有按下屏幕的手指的所有信息。如果你只对按下按钮的那一个感兴趣,你可能会有这样的结果:

    NSSet *myTouches = [event touchesForView:self.view];
    
    NSUInteger numTaps = [[myTouches anyObject] tapCount];
    
    因此,现在您已经有了与按钮对应的触摸,您必须了解用户点击该按钮的次数。你可以这样做:

    NSSet *myTouches = [event touchesForView:self.view];
    
    NSUInteger numTaps = [[myTouches anyObject] tapCount];
    
    如果这个数字是2,这意味着用户只需双击您的按钮。现在是下一部分。您如何知道用户是否正在按住该按钮?当用户放开屏幕时,会调用另一个方法。您还需要覆盖该选项:

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    
    在这里,您可以知道此人是否已停止触摸屏幕,或者他的手指是否仍在屏幕上。如果他的手指还在上面,那么这个事件还没有被调用

    现在背景已经足够了

    这是我给你的建议。我建议您覆盖touchesbreated:方法,并检查按钮中的点击次数是否为2。如果是这样的话,那么启动一个定时器来完成你需要它做的事情,只要你需要它做,然后在touchesend:方法上,你将继续并停止该定时器,这样你就可以完成你需要做的任何事情,只要你需要做,或者只要用户按住按钮


    我希望这会有所帮助,很明显,我并没有为您编写全部代码,您将不得不对这些东西进行实验和研究,但如果您有任何问题,我很乐意伸出援助之手:)

    是的,使用UILongPressGestureRecognitor(在iPhone OS 3.2+上)实现这一点相当容易。长按将由手势识别器处理,短按将传递到按钮的正常操作

    例如,我将UIButton子类化,并添加了以下方法,用于指定与轻触同时进行的长触动作(
    LongPressGestureRecognitor
    是一个实例变量):

    然后,我可以执行以下操作来设置短点击和长按操作,这些操作将由同一目标处理:

    [undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside];
    [undoButton setLongTouchAction:@selector(showUndoOptions:)];
    

    正如您所见,这对于许多iPad应用程序标题栏中的撤销按钮非常有用。

    布拉德·拉森的答案看起来不错,但这里还有一个可能会让您更灵活/控制您想要或可能想要做的事情

    您将UIButton子类化,覆盖touchesBegind和toucheSend方法,以便在用户开始触摸时调用

    [self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0];
    
    在touchseded中,您可以调用:

    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil];
    
    如果手指过早抬起,则取消事件

    你可以在这篇博文中获得完整的代码:


    此外,这是针对3.2之前版本的iPhone操作系统的唯一方法。在那之前,操作系统中不存在像我使用的手势识别器。我可以在Cocos2D或Box2D游戏中使用LongPressGestureRecognitor吗。在我的游戏中,我需要根据触摸屏的持续时间来改变玩家的跳跃?或者我的解决方案还能是什么?