UIButton 上的 UITapGestureRecognizer

Posted

技术标签:

【中文标题】UIButton 上的 UITapGestureRecognizer【英文标题】:UITapGestureRecognizer on a UIButton 【发布时间】:2010-11-05 11:06:23 【问题描述】:

我有一个 UIButton,它有一个 IBAction 和一个 UITapGestureRecognizer 来检测双击。

目前,IBAction 似乎正在阻止识别器。有没有办法阻止这种情况,或者 UITapGestureRecognizer 甚至可以在按钮上工作?如果是这样,只添加识别器并删除 IBAction 不是更好吗?

编辑

UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
[doubleTap setNumberOfTapsRequired:2];
[A1 addGestureRecognizer:doubleTap];
[A2 addGestureRecognizer:doubleTap];
[B1 addGestureRecognizer:doubleTap];

【问题讨论】:

手势识别器可以在按钮上工作,但您是否根据单击或双击执行不同的操作? Button 对此似乎有点不直观。阻塞实际上应该以相反的方式发生。一些代码可能会有所帮助。 我在手势识别器上有一个双击,明显的 1 次点击触发了 IBAction。 显示将识别器添加到按钮的代码。 我编辑了这个问题,谢谢。 【参考方案1】:

看起来您正试图将一个手势识别器附加到多个按钮。手势识别器一次只能附加到一个视图。因此,在您的情况下,您将识别器附加到的最后一个按钮(按钮 B1)可能会响应双击,但 A1 和 A2 不会。

为每个按钮创建一个单独的识别器。 但所有三个识别器都可以调用相同的操作方法 (handleDoubleTap:)。

但是,当您尝试单击按钮时,会出现轻微延迟,因为它会等待查看是否是双击的开始。有一些方法可以减少延迟,但如果您可以忍受延迟并且变通办法会带来其他问题,则可能不值得。

编辑: 在您的评论中,您说您“想检测它们是否同时被按下”。为此,您不需要手势识别器。您可以只使用提供的标准控制事件。

接下来,在 IB 中,对于 每个 按钮,将“Touch Down”事件与buttonPressed: 挂钩。或者,以编程方式进行:

[button1 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button2 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];
[button3 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown];

接下来,在 IB 中,对于 每个 按钮,连接“Touch Up Inside”“与buttonReleased: 联系的“Touch Up Outdoor”活动。或者,以编程方式进行:

[button1 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button2 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];
[button3 addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside|UIControlEventTouchUpOutside];

接下来,添加 ivars 以跟踪按下了多少或哪些按钮:

@property (nonatomic) int numberOfButtonsBeingTouched;
@property (strong, nonatomic) NSMutableSet *buttonsBeingTouched; //alloc + init in viewDidLoad or similar

如果您只关心按下了多少按钮,则不需要NSMutableSet

最后,添加 buttonPressed 和 buttonReleased 方法:

- (IBAction)buttonPressed:(UIButton *)button 
    self.numberOfButtonsBeingTouched++;
    [self.buttonsBeingTouched addObject:button];
    //your logic here (if (self.numberOfButtonsBeingTouched == 3) ...)


- (IBAction)buttonReleased:(UIButton *)button 
    self.numberOfButtonsBeingTouched--;
    [self.buttonsBeingTouched removeObject:button];
    //your logic (if any needed) here

【讨论】:

好的,谢谢。有没有办法在一个按钮上检测多个点击,比如 2 或 3 个同时点击?但我想通过另一种方式检测到这一点,而不是检查每个按钮并以某种方式链接它们同时被触摸。谢谢 要同时检测多个手指,您可以使用 UITapGestureRecognizer 并将 numberOfTapsRequired 设置为 1 并将 numberOfTouchesRequired 设置为 2(或 3 或其他)。我不明白你评论的第二部分。您可能希望通过解释您尝试获得的功能来更新您的问题。也许使用按钮和手势识别器不适合这种情况。 我有多个按钮,想检测它们是否被同时按下。 非常感谢您的帮助。 :) 这里是一个例子:手指 A 按下 button1(buttonsTouched 现在等于 1)。手指 B 按下按钮 2(buttonsTouched 现在等于 2)。手指 A(未抬起)滑出 button1,然后抬起(buttonsTouched 现在等于 1)。如果不包括 TouchUpOutside,那么在此示例中,即使只有一根手指(手指 B)正在触摸按钮,buttonsTouched 仍将为 2。尝试使用答案中的示例代码。将 NSLogs 放在 buttonPressed 和 buttonReleased 方法中查看结果,欢迎您根据需要进行修改。

以上是关于UIButton 上的 UITapGestureRecognizer的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIButton 上的 UIImageView 会在触摸时重新出现?

同一视图上的 tableview 和 UIButton

UIButton 上的 CGAffineTransformMakeTranslation 问题

避免 UIPickerView ios 上的 UIButton 覆盖

我可以更改 UIButton 上的色调颜色,但不能更改 UIImage

UIButton 上的图像