我有一个包含UITableViewCells的TableView,每个都有6个按钮......
UISwipeGestureRecognizer被添加到每个按钮中,如下所示:
- (void)awakeFromNib {
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_XXSButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_XSButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_SButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_MButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_LButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_XLButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_XXLButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
}
- (void)handleRightSwipe:(UIGestureRecognizer *)gestureRecognizer {
UIButton *button = (UIButton *)[gestureRecognizer view];
[self zeroButton:button];
}
当识别滑动时,它会调用方法zeroButton。
无论我在哪个按钮上滑动,检索到的视图都是第一个按钮。我本来期望[gestureRecognizer视图]返回执行滑动的按钮。 任何想法为什么我总是只收到第一个按钮的手势?
我认识到这段代码不是最优雅的,必须创建6个不同的UISwipeGestureRecognizer。我宁愿在UITableViewCell本身上创建手势,并手动检查滑动是通过特定按钮发起还是通过。不幸的是,我对此的尝试已被证明是不可靠的。因此,如果有人建议如何实施该方法,那就更好了 (我稍后会发布“解决方案”)
...谢谢
答案 0 :(得分:1)
一种替代方法,因为您使用UIButton
s会在按钮上使用addTarget:action:forControlEvents:
进行事件:
UIControlEventTouchDragInside
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter
UIControlEventTouchDragExit
并在您指定的action
方法中进行处理。
将你的手势处理方法中的分支“映射”到你班级内的不同方法(或者只是一个方法,如果你愿意)应该不难。
我知道这不是一个完全令人满意的答案,因为它放弃了使用手势识别器(及其设施),但它可能适合你。
至于为什么手势识别器在应用于UITableViewCell
时无法正常工作(并且可能还解释了为什么只有第一个按钮似乎接收到手势),您在评论中描述的行为提醒我虽然UIScrollView
(UITableView的基类)是贪婪的(但不仅仅是UIWebView
),这肯定会对触摸的转发方式产生影响。所以,我不知道它是否有效,但我在UIScrollView
中找到了这个:
delaysContentTouches
如果此属性的值为YES,则滚动视图会延迟处理触摸手势,直到它可以确定滚动是否为意图。如果值为NO,则滚动视图立即调用touchesShouldBegin:withEvent:inContentView:。默认值为YES。
这可能有效或无效,甚至可能使UITableView根本不起作用,但很容易尝试。
如果这不起作用并且我之前的假设仍然正确,那么解决它的方法是子类化UITableView
并覆盖与触摸相关的方法(例如,touchesShouldBegin:withEvent:inContentView:
),以便您可以自定义它们的行为。
陈旧而错误的回答:
我的理解是你可以在不同的视图中共享一个相同的手势识别器,如下所示:
rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_LButton addGestureRecognizer:rightSwipe];
[_SButton addGestureRecognizer:rightSwipe];
[_XButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
我不知道这是否可以解决您的问题,因为在您的情况下发生的情况是,无论您刷哪个按钮,始终是第一个手势识别器被激活,这很难解释,因为您有不同的按钮。这可能与按钮之间的某些重叠(我在猜测)或者所有按钮都“嵌入”在表格单元格中有关,因此单元格级别的滑动机制会干扰按钮的滑动机制。亚细胞水平,但我不确定。
作为一种肯定有效的替代方法,您可以将手势识别器附加到表格单元格(您提到尝试将其附加到表格视图本身;附加到表格单元格将起作用)。
希望这有帮助。
答案 1 :(得分:1)
实际上,zeroButton代码中的一个错误导致它始终重置第一个按钮。我使用分配给按钮的标签来确定要创建的操作。我的标签设置不正确!傻我。所以我原来问题中的代码实际上是正确的。
由于我修改了以下代码:
- (void)awakeFromNib {
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
rightSwipe.delegate = self;
[self addGestureRecognizer:rightSwipe];
[rightSwipe release];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([touch.view isKindOfClass:[UIButton class]])
{
// only recognises gesture started on a button
return YES;
}
return NO;
}
- (void)handleRightSwipe:(UIGestureRecognizer *)gestureRecognizer {
// Determine which button received the right swipe
// Get the position of the point tapped in the UIViewCell co-ordinate system
CGPoint tapPoint = [gestureRecognizer locationInView:self];
NSLog(@"%.1f %.1f", tapPoint.x , tapPoint.y);
UIView *viewAtBottomOfHierarchy = [self hitTest:tapPoint withEvent:nil];
if ([viewAtBottomOfHierarchy isKindOfClass:[UIButton class]])
{
[self zeroButton:(UIButton *)viewAtBottomOfHierarchy];
}
}
这会查看滑动的起源位置并确定它开始的按钮(如果有的话)......