繁体   English   中英

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

[英]Is it possible to differentiate between a long press and a tap on a button?

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

  1. 点击UIButton
  2. 在UIButton上点击并按住

是的,使用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应用程序的标题栏中看到的撤消按钮很有用。

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

你是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/

我能想到的最好的解决方案是创建另一个类,并创建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:方法中,你将继续并停止该计时器,这样你就可以完成你需要做的任何事情,只要你需要这样做或者只要用户坚持下去到按钮。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM