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

时间:2013-02-08 12:27:39

标签: iphone ios view uigesturerecognizer

在一个viewController上我有一个mainView,在该视图上我有另一个视图(这被称为sidePanel视图有帧0,0,86,420。)我添加了tapGesture。现在我想只为sidePanelView以外的mainView启用手势识别。 见下图 enter image description here

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

6 个答案:

答案 0 :(得分:25)

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

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

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

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

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

答案 1 :(得分:14)

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
   shouldReceiveTouch:(UITouch *)touch;

答案 2 :(得分:7)

Swift 3版本:

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

答案 3 :(得分:4)

陷入类似的问题;最后使用@Rob的答案。这是一个Swift版本:

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

答案 4 :(得分:3)

如果要为特定视图禁用UITapGestureRecognizer,只需删除userInteraction。

<强>实施例

sidePanel.userInteractionEnabled = NO;

答案 5 :(得分:0)

我在

的帮助下做到了这一点

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

并且我检查了触点位置&amp;根据触摸位置,我做了我的工作

if(points.x>86)
    {//hide the side panel
     }

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