具有UITapGestureRecognizer的视图内的UIButton

我有一个UITapGestureRecognizer视图。 所以当我点击视图时,另一个视图出现在这个视图上方。 这个新视图有三个button。 当我现在按下其中的一个button时,我没有得到button的动作,我只能得到轻拍手势动作。 所以我不能使用这些button了。 我能做些什么来获得这些button的事件? 奇怪的是,button仍然突出显示。

我收到它后,不能移除UITapGestureRecognizer。 因为有了它,新的视图也可以被删除。 意味着我想要一个像全屏video控件行为

您可以设置您的控制器或视图(无论哪个创build手势识别器)作为UITapGestureRecognizer的代表。 然后在委托中,您可以实现-gestureRecognizer:shouldReceiveTouch: 在您的实现中,您可以testing触摸是否属于您的新子视图,如果是,请指示手势识别器忽略它。 像下面这样:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // test if our control subview is on-screen if (self.controlSubview.superview != nil) { if ([touch.view isDescendantOfView:self.controlSubview]) { // we touched our control surface return NO; // ignore the touch } } return YES; // handle the touch } 

作为凯西跟随凯文·巴拉德的答案的后续行动:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIControl class]]) { // we touched a button, slider, or other UIControl return NO; // ignore the touch } return YES; // handle the touch } 

这基本上使所有的用户inputtypes的控制像button,滑块等工作

在这里find这个答案: 链接

你也可以使用

 tapRecognizer.cancelsTouchesInView = NO; 

这可以防止水龙头识别器成为唯一能够捕捉所有水龙头的水龙头识别器

更新 – 迈克尔提到了描述这个属性的文档的链接: cancelsTouchesInView

作为Kevin Ballard的回答,我遇到了同样的问题,最后使用了这个代码:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ return NO; } return YES; } 

它具有相同的效果,但是这可以在任何视图深度的任何UIButton上工作(我的UIButton是几个深度的视图,UIGestureRecognizer的委托没有引用它。)

find另一种方法从这里做到这一点 。 它检测每个button内是否有触摸。

(1) pointInside:withEvent: (2) locationInView:

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Don't recognize taps in the buttons return (![self.button1 pointInside:[touch locationInView:self.button1] withEvent:nil] && ![self.button2 pointInside:[touch locationInView:self.button2] withEvent:nil] && ![self.button3 pointInside:[touch locationInView:self.button3] withEvent:nil]); } 

在iOS 6.0和更高版本中,默认控制操作可防止重叠的手势识别器行为。 例如,button的默认操作是单击。 如果您将一个轻击手势识别器附加到button的父视图,并且用户点击该button,则button的操作方法会接收触摸事件,而不是手势识别器。 这仅适用于与控件的默认操作重叠的手势识别,其中包括:…..

从苹果的API文档

这些答案是不完整的。 我必须阅读多篇文章,了解如何使用这个布尔操作。

在你的* .h文件中添加这个

 @interface v1ViewController : UIViewController <UIGestureRecognizerDelegate> 

在你的* .m文件中添加这个

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { NSLog(@"went here ..."); if ([touch.view isKindOfClass:[UIControl class]]) { // we touched a button, slider, or other UIControl return NO; // ignore the touch } return YES; // handle the touch } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //tap gestrure UITapGestureRecognizer *tapGestRecog = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(screenTappedOnce)]; [tapGestRecog setNumberOfTapsRequired:1]; [self.view addGestureRecognizer:tapGestRecog]; // This line is very important. if You don't add it then your boolean operation will never get called tapGestRecog.delegate = self; } -(IBAction) screenTappedOnce { NSLog(@"screenTappedOnce ..."); } 

这是凯文·巴拉德答案的迅速版本,为我工作:

 func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { if (scrollView.superview != nil) { if ((touch.view?.isDescendantOfView(scrollView)) != nil) { return false } } return true } 

您可以通过设置以下布尔值来停止UITapGestureRecognizer取消其他事件(例如点击button):

  [tapRecognizer setCancelsTouchesInView:NO]; 

如果你的情况是这样的:

你有一个简单的视图和一些UIButtons,UITextField控件作为子视图添加到该视图。 现在,当您触摸视图中除控件之外的其他任何位置(您添加的子视图)时,您想要closures键盘。

那么解决scheme是:

添加下面的方法到你的XYZViewController.m(它有你的视图)

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; } 

优化@cdasher的答案,你会得到的

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return ![touch.view isKindOfClass:[UIControl class]]; }