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 会在触摸时重新出现?
UIButton 上的 CGAffineTransformMakeTranslation 问题
避免 UIPickerView ios 上的 UIButton 覆盖