6种不同的UISwipeGestureRecognizer,总是收到同一个

时间:2011-07-12 07:33:55

标签: ios ipad uigesturerecognizer

我有一个包含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本身上创建手势,并手动检查滑动是通过特定按钮发起还是通过。不幸的是,我对此的尝试已被证明是不可靠的。因此,如果有人建议如何实施该方法,那就更好了 (我稍后会发布“解决方案”)

...谢谢

2 个答案:

答案 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];
    }
}

这会查看滑动的起源位置并确定它开始的按钮(如果有的话)......