iOS gestureRecognizer未处理子视图

时间:2014-05-19 11:25:19

标签: ios objective-c uigesturerecognizer

我有以下问题:在我的iphone应用程序中,我有UIView,其中包含0到多个子视图。这些子视图可能会溢出父级,因此会被隐藏,所有子视图都是UIButtons。我在UISwipeGestureRecognizer添加了UIView来移动按钮,效果很好。然而,它仅在手势在背景上完成时起作用,UIButton s干扰手势识别器。

我怎么能通过手势?顺便说一句。我仍然需要按下按钮。

谢谢!

修改

我也试图将手势识别器添加到UIButton,但它没有被触发......虽然执行滑动手势可以防止UIButton进入突出显示状态,但它不会触发手势。我按UIButton and Swipe Gesture中的建议添加了setDelaysTouchesBegan:YES。这就是我现在的表现:

UIButton *breadcrumb = [UIButton buttonWithType:UIButtonTypeCustom];
[breadcrumb setImage:[UIImage imageNamed:@"Next"] forState:UIControlStateNormal];
[breadcrumb setTitle:title forState:UIControlStateNormal];
[breadcrumb.titleLabel setFont:[UIFont systemFontOfSize:12.0f]];
[breadcrumb sizeToFit];
[breadcrumb setTag:level];


UISwipeGestureRecognizer *gr = [[UISwipeGestureRecognizer alloc] init];
[gr setDelegate:self];
[gr setDirection:UISwipeGestureRecognizerDirectionRight];
[gr setDelaysTouchesBegan:YES];
[self.tableView addGestureRecognizer:gr];
[breadcrumb addGestureRecognizer:gr];

编辑2:

我现在已经将UIButton子类化并现在启动它:[BreadcrumbButton buttonWithType:UIButtonTypeCustom]。在初始化程序中,我将按钮本身添加为所有触摸事件[self addTarget:self action:@selector(eventReceiver:) forControlEvents:UIControlEventAllTouchEvents];的监听器,以检查正在进行的操作。

- (void)eventReceiver:(UIButton *)btn {
    NSLog(@"Reveived event: %@ ---------------", btn);

    for(UIGestureRecognizer *gr in ev.gestureRecognizers) {
        NSLog(@"Gesture: %@", gr);
    }
}

我看到的是a)按钮只添加了一个手势识别器,b)这个UISwipeGestureRecognizer在滑动过程中跳转到状态Possible但不转发到其委托方法。

1 个答案:

答案 0 :(得分:1)

您必须将UIButton子类化并重新点击tap委托回调并将此调用转发给处理UISwipeGestureRecognizer的任何内容。除非您在UIButton上添加手势识别器,否则它将始终在其后面的视图之前调用它的触摸处理程序。您还可以明确告诉按钮不处理它的触摸事件,从而将触摸事件传递给链(通过userInteractionEnabled),但正如您已经说过的那样,您不希望这样。解决这个问题的最佳方法是创建UIButton的子类并在那里处理触摸事件和/或使用委托转发事件。按下按钮是一个触摸事件,因此您可能只想在按钮上添加一个轻击手势识别器并从中调用IBAction,然后让swipegesturerecognizer转发一个委托调用。