如何处理 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.
}
}
在应用程序中,我有几个创建并添加到 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.
}
}