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

Posted

技术标签:

【中文标题】仅针对特定视图禁用手势识别器【英文标题】:Disable gesture recognizer only for a particular view 【发布时间】:2013-02-08 12:27:38 【问题描述】:

在一个视图控制器上,我有一个mainView。在那个视图中,我有另一个视图 sidePanel,它的帧为 0,0,86,420。我添加了一个点击手势识别器。现在我只想为 mainView 而不是 sidePanelView 启用手势识别。见下图:

我想为 sidePanelView 禁用 tapGesture 并为除它之外的所有区域启用。我怎样才能做到这一点? (还有一点想说,sidePanelView以外的区域是sidePanelView的parentView)。

【问题讨论】:

【参考方案1】:

您应该接受 Bharat 的回答,因为这是正确的。我只想说明你是如何做到的:

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

    @interface ViewController () <UIGestureRecognizerDelegate>
    // the rest of your interface
    @end
    

    确保为手势设置delegate

    UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleMainTap:)];
    gesture.delegate = self;
    [self.view addGestureRecognizer:gesture];
    

    然后检查是否对相关视图进行了触摸:

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

【讨论】:

如何绑定viewcontroller? 我不明白你的问题。 你写这段代码:self.menuView.bounds,但是我怎么绑定Demomenuviewcontroller -github.com/romaonthego/REFrostedViewController @GamiNilesh - 我建议您发布您自己的问题,向我们展示您如何使用该代码,并给我们一个reproducible example。我完全不清楚您要说什么,所以也许您可以在自己的问题中更详细地描述您的情况,而不是在 cmets 中。【参考方案2】:

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

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

【讨论】:

@RavindraBagale 您是否将手势识别器的delegate 设置为视图控制器?巴拉特的答案是正确的。【参考方案3】:

Swift 3 版本:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

sidePanel.userInteractionEnabled = NO;

【讨论】:

但我在该视图上有要单击的按钮【参考方案6】:

的帮助下我做到了

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

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

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

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

【讨论】:

以上是关于仅针对特定视图禁用手势识别器的主要内容,如果未能解决你的问题,请参考以下文章

特定手势的同时手势识别

在 AVPlayerViewController 中禁用手势识别器

如何在iOS 7中仅针对一个视图禁用后退手势

暂时禁用手势识别器滑动功能

将平移手势识别器限制为特定圆圈

使平移手势识别器仅在向下滑动时在桌面视图的顶部进行响应