5

我有一个 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];
4

1 回答 1

5

看起来您正试图将一个手势识别器附加到多个按钮。手势识别器一次只能附加到一个视图。因此,在您的情况下,您将识别器附加到的最后一个按钮(按钮 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”“Touch Up Outside”事件与buttonReleased:. 或者,以编程方式进行:

[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
}
于 2010-11-05T16:23:18.880 回答