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