如何处理 UIButton 上的触摸事件和手势事件?

How to handle touch events and gesture events on a UIButton?

在应用程序中,我有几个创建并添加到 UITableView 的动态按钮,每个按钮都有一个触摸事件 (UIControlEventTouchUpInside) 和一个长按手势 (UILongPressGestureRecognizer),我想一次执行任何一个操作时间。因此,如果当用户仅触摸按钮操作时将被调用。如果用户长按则长按事件将被调用。

目前,即使我长按按钮,它也总是调用操作。

我应该如何处理这个事件?有什么好的建议吗?

在 Tableview 的 cellForRowAtIndex 中使用此代码:

[cell.btn addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];

并在 cellForRowAtIndex 之外实现此方法。

-(void)btnPressed:(UIButton*)btn
{
   //Do whatever
} 

长按使用此代码

`UILongPressGestureRecognizer` *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    [cell.button addGestureRecognizer:longPress];

长按方法是

-(void)longPress:(UIButton*)btn
{
   //Do whatever
} 

您可以在按钮操作事件中添加以下代码。我已经为 tableview 中的多个复选框完成了这段代码。借助这段代码,您可以获得tableview记录的IndexPath。希望对你有用。

- (IBAction)btnPressed:(UIButton *)sender {

CGPoint touchPoint = [sender convertPoint:CGPointZero toView:self.tblView];
NSIndexPath *indexpath = [self.tblView indexPathForRowAtPoint:touchPoint];
 NSLog(@"%ld",(long)indexpath.row);
}

为了不同时触发两者,您应该使用全局变量或标记来标记按钮,以便在 UIControlEventTouchUpInside 的目标中您可以过滤操作。

所以我们假设您的 UILongPressGestureRecognizer 在触发时调用 longPress,并且它在您的 自定义单元格中初始化。 & UIControlEventTouchUpInside 调用目标btnPressed

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self.button addGestureRecognizer:longPress];
[self.button addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];

自定义单元格内的选择器调用:

-(void)longPress:(UIButton*)btn
{
   // Flag the button,
   self.button.tag = 1;

   // Do LongPress stuff.  

}

UIControlEventTouchUpInside

按钮的目标
- (void)btnPressed:(id)sender { 

    UIButton *senderButton = sender;

    if(senderButton.tag == 1) {
        // Long press has been executed, set back the flag to 0
        senderButton.tag = 0;
    } else {
        // Long press not executed 
        // Do the TouchUpInside stuff.
    }
}