Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 6个不同的UISweepGestureRecognitor,始终接收相同的UISweepGestureRecognitor_Ios_Ipad_Uigesturerecognizer - Fatal编程技术网

Ios 6个不同的UISweepGestureRecognitor,始终接收相同的UISweepGestureRecognitor

Ios 6个不同的UISweepGestureRecognitor,始终接收相同的UISweepGestureRecognitor,ios,ipad,uigesturerecognizer,Ios,Ipad,Uigesturerecognizer,我有一个包含UITableViewCells的TableView,每个单元格有6个按钮 每个按钮都添加了一个UISweepGestureRecognitor,如下所示: - (void)awakeFromNib { UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self

我有一个包含UITableViewCells的TableView,每个单元格有6个按钮

每个按钮都添加了一个UISweepGestureRecognitor,如下所示:

- (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

无论我在哪个按钮上滑动,检索到的视图都是第一个按钮的视图。我希望[GestureRecognitor view]返回执行刷卡的按钮。 你知道为什么我总是只收到第一个按钮的手势吗

我认识到,这段代码不是最优雅的开始,必须创建6个不同的UISweepGestureRecognitor。我更愿意在UITableViewCell本身上创建手势,并手动检查滑动是否源自或通过特定按钮。不幸的是,我的尝试被证明是不可靠的。因此,如果有人对如何实现该方法提出建议,那就更好了 (我稍后会发布“解决方案”)


谢谢…

一种替代方法,因为您使用的是
ui按钮
s将在事件按钮上使用
addTarget:action:forControlEvents:

UIControlEventTouchDragInside 
UIControlEventTouchDragOutside
UIControlEventTouchDragEnter  
UIControlEventTouchDragExit  
并在指定的
操作
方法中执行处理。 将手势处理方法中的分支“映射”到类中的不同方法(或者只映射一个方法,如果您愿意)应该并不困难

我知道这不是一个完全令人满意的答案,因为它放弃了使用手势识别器(及其设备),但它可以为您工作

至于为什么手势识别器在应用于
UITableViewCell
时不能正常工作(可能还解释了为什么只有第一个按钮似乎接收到手势),您在评论中描述的行为提醒我,
UIScrollView
(UITableView的基类)对触摸非常贪婪(虽然不如说是一个
UIWebView
),而且这肯定会对如何转发触摸产生影响。因此,我不知道它是否有效,但我在
UIScrollView
中发现了这一点:

延迟内容接触

如果此属性的值为“是”,则滚动视图会延迟处理触摸手势,直到它能够确定滚动是否是目的。如果该值为“否”,则滚动视图会立即调用ToucheShouldBegin:withEvent:inContentView:。默认值为“是”

这可能有效,也可能无效,甚至可能使UITableView根本不起作用,但很容易尝试

如果这不起作用,并且我之前的假设仍然正确,那么解决方法是将
UITableView
子类化,并覆盖与触摸相关的方法(例如,
touchesshouldbeagin:withEvent:inContentView:
),以便您可以自定义它们的行为

古老而错误的答案:

据我所知,您可以在不同的视图中共享同一个手势识别器,如下所示:

rightSwipe = [[UISwipeGestureRecognizer alloc]
              initWithTarget:self
              action:@selector(handleRightSwipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;
[_LButton addGestureRecognizer:rightSwipe];
[_SButton addGestureRecognizer:rightSwipe];
[_XButton addGestureRecognizer:rightSwipe];
[rightSwipe release];
我不知道这是否能解决你的问题,因为在你的情况下,无论你刷哪个按钮,总是第一个手势识别器被激活,这很难解释,因为你有不同的按钮。这可能与一些重叠有关(我猜)在这些按钮中,或者说您的所有按钮都“嵌入”在一个表单元格中,因此单元格级别的滑动机制会干扰子单元格级别的滑动机制,但我对此不确定

作为一种替代方法,您可以将手势识别器附加到表格单元格上(您提到了将其附加到表格视图本身的尝试;附加到表格单元格将有效)


希望这有帮助。

事实上,是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];
    }
}

这将查看刷卡的起始位置,并确定刷卡的起始位置(如果有)…

不,我提到我将手势附加到UITableViewCell,而不是UITableView。执行此操作时,按钮没有响应性,而且通常根本无法识别滑动:例如,您不能在按钮上的任何位置执行滑动。此外,我很确定您不能在不同的视图之间共享手势识别器(根据对此类案例进行疑难解答的所有评论)。抱歉,我误读了表格的单元格…:(如果您介意的话,我又添加了一个建议…我已经用我的答案编辑了问题(因此,在等待8小时之前,不允许我添加答案),包括代码如何仅用一个手势处理一切