是否可以区分长按和按下按钮?

时间:2010-12-16 19:34:35

标签: iphone cocoa-touch uiview uibutton

我们可以调用不同的行动/代表来回应

的两个不同事件
  1. 点击UIButton
  2. 点击并按住UIButton

3 个答案:

答案 0 :(得分: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应用程序的标题栏中看到的撤消按钮非常有用。

答案 1 :(得分:8)

布拉德拉森的答案看起来很不错,但这是另一个可能会让你更灵活/控制你想要或想要做的事情。

你是UIButton的子类,你覆盖了touchesBegan和touchesEnded方法,这样当用户开始触摸你就可以调用

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

并且在触摸中,你打电话给:

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

取消活动。

您可以在此博文中获取完整的代码:

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

答案 2 :(得分: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:方法中,你将继续并停止该计时器,这样你就可以完成你需要做的任何事情,只要你需要这样做或者只要用户坚持下去按钮。

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