2010-12-16 41 views

回答

16

是的,使用UILongPressGestureRecognizer(在iPhone OS 3.2+上)实现它是相当容易的。长按将由手势识别器处理,并且短按会通过按钮的正常动作。

例如,我子类的UIButton和增加了以下方法用于确定长触摸动作到具有抽头走(longPressGestureRecognizer是一个实例变量):

- (void)setLongTouchAction:(SEL)newValue 
{ 
    if (newValue == NULL) 
    { 
     [self removeGestureRecognizer:longPressGestureRecognizer]; 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 
    } 
    else 
    { 
     [longPressGestureRecognizer release]; 
     longPressGestureRecognizer = nil; 

     longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue]; 
     [self addGestureRecognizer:longPressGestureRecognizer]; 
    } 
} 

我然后可以执行以下操作来设定这两个短击长按压动作将由同一目标进行处理:

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

正如你所看到的,这是你在许多iPad的应用程序标题栏看到撤销按钮有用。

+0

我可以在cocos2d或Box2D的游戏中使用longPressGestureRecognizer。在我的游戏中,我需要根据屏幕上的触摸持续时间来改变玩家跳跃?或者还有什么是我的解决方案? – Nitish 2011-04-27 12:27:35

4

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

因此,在这个新的类,你必须覆盖一个名为

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

这基本上是告诉你,有人按下此按钮的方法。触摸是一个NSSet,它包含了在屏幕上按下的所有手指的所有信息。如果你只有感兴趣的是最为紧迫的按钮本身的一个,你可能会碰到这样的:

NSSet *myTouches = [event touchesForView:self.view]; 

所以,现在你有符合您的按钮,润色,你必须找出多少用户点击该按钮的次数。你可以这样做:

NSUInteger numTaps = [[myTouches anyObject] tapCount]; 

如果这个数字是2,这意味着用户只是双击你的按钮。接下来的部分。你怎么知道用户是否拿着那个按钮?那么当用户放开屏幕时,就会调用另一个方法。您还需要覆盖该项:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

这是您知道该人是否已停止触摸屏幕或手指仍在其上的位置。如果他的手指仍然在上面,那么这个事件还没有被调用。

现在足以与背景

这是我给你的建议。我建议你重写touchesBegan:方法,并检查按钮中的水龙头数是否为2.如果是,则启动一个计时器,根据需要执行该操作,只要您需要完成,然后在touchesEnded:方法中,您将继续并停止该计时器,这样,只要您需要执行此操作,或者只要用户持续执行,您就可以完成您需要执行的任何操作到按钮。

我希望这有帮助,显然我没有为你编写整个代码,你必须对这些东西进行实验和研究,但是如果你有任何问题,我会很乐意伸出援助之手: )

8

布拉德拉森的回答看起来不错,但这里有另一个可能会给你更多的灵活性/控制你想要或可能想做的事情。

你继承的UIButton,你重写的touchesBegan和touchesEnded方法,以便当用户开始触摸你打电话

[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0]; 

,并在touchesEnded你拨打:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil]; 

取消事件如果手指抬得太快。

你可以得到这个完整的代码在这篇博客文章:

http://www.isignmeout.com/adding-long-tap-functionality-uibutton/

+0

此外,这是针对那些针对早于3.2的iPhone OS版本的人的唯一方法。在此之前,我使用的手势识别器在操作系统中并不存在。 – 2010-12-17 04:05:11