开发者

In iOS, How to disallow gesture recognition in the toolbar?

开发者 https://www.devze.com 2023-03-04 07:17 出处:网络
My view has a toolbar with two buttons of type UIBarButtonItem. I\'m trying to implement a gesture recognizer such that when I tap anywhere in the view except in the toolbar, I call a selector. Tappin

My view has a toolbar with two buttons of type UIBarButtonItem. I'm trying to implement a gesture recognizer such that when I tap anywhere in the view except in the toolbar, I call a selector. Tapping on a bar button item in the toolbar should call that button's action method. The view conforms to the UIGestureRecognizerDelegate protocol and implements the shouldReceiveTouch method as follows:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
                                                shouldReceiveTouch:(UITouch *) touch {
  // Disallow recognition of tap gestures in the toolbar
  if ((touch.view == self.sideOneBarButton.customView) &&
      (gestureRecognizer == self.tapRecognizer)) {
    return NO;
  }
  return YES;
}

The problem is, when I tap on the toolbar button, touch.view is of type UTToolbarTextButton* which is an undocumented class, so my if statement fails and the shouldReceiveTouch always returns YES and my button e开发者_运维问答vent never gets called.

Ideally, I'd like to say: if the touch is anywhere in the toolbar, then return no. What's the best way to do this?


About the delegate function, this is good for me.

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


There is a way to ignore the gesture on anything that isn't your central view.

For instance I have:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                               initWithTarget:self
                               action:@selector(dismissKeyboard)];

tap.delegate = self;

[self.view addGestureRecognizer:tap];

Add the gesture delegate to the class:

@interface myClass : UIViewController<..,UIGestureRecognizerDelegate,..>

and now the delegate function:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if (touch.view == self.view)
    {
        return YES;
    }
    return  NO;
}

This has worked out for me when I couldn't use the UIToolbar because of the gesture

Also, as @LandedGently has mentioned, there is more information here:

UIButton inside a view that has a UITapGestureRecognizer

so people don't miss the link in the comments.

0

精彩评论

暂无评论...
验证码 换一张
取 消