仅针对特定视图禁用手势识别器

Rav*_*ale 13 iphone view uigesturerecognizer ios

在一个viewController我有一个mainView,在该视图上我有另一个视图(这被称为sidePanel视图有帧0,0,86,420.)我添加了tapGesture.现在我想只为sidePanelView以外的mainView启用手势识别.见下图
在此输入图像描述

我想为sidePanelView禁用tapGesture并启用除此之外的区域.怎么做.(有一点我想说sidePanelView以外的区域是sidePanelView的parentView).

Rob*_*Rob 25

你应该接受巴拉特的答案,因为这是正确的.我只想说明你是如何做到的:

  1. 将视图控制器定义为符合UIGestureRecognizerDelegate,例如:

    @interface ViewController () <UIGestureRecognizerDelegate>
    // the rest of your interface
    @end
    
    Run Code Online (Sandbox Code Playgroud)
  2. 确保delegate为手势设置:

    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMainTap:)];
    gesture.delegate = self;
    [self.view addGestureRecognizer:gesture];
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后检查以查看相关视图是否触摸:

    - (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
    {
        if (CGRectContainsPoint(self.menuView.bounds, [touch locationInView:self.menuView]))
            return NO;
    
        return YES;
    }
    
    Run Code Online (Sandbox Code Playgroud)


Bha*_*ati 14

您可以在UIGestureRecognizerDelegate中使用gestureRecognizer:shouldReceiveTouch:方法查看触摸发生的位置,并决定是否要响应手势.如果触摸距离视图边缘太近(要禁用的位置),则返回NO,否则返回YES.或者只需检查touch.view以查看UIImageView上是否发生了触摸.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
   shouldReceiveTouch:(UITouch *)touch;
Run Code Online (Sandbox Code Playgroud)


zgj*_*jie 7

Swift 3版本:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if theView.bounds.contains(touch.location(in: theView)) {
        return false
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*hen 5

遇到了类似的问题;最终使用了@Rob 的答案。这是一个 Swift 版本:

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
    }
}
Run Code Online (Sandbox Code Playgroud)


Rav*_*ale 1

我已经做到了这一点,在帮助下

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

我已经检查了触摸点位置并根据触摸位置我做了这样的工作

if(points.x>86)
    {//hide the side panel
     }
Run Code Online (Sandbox Code Playgroud)

它识别手势并与事件同步。