15

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

左视图越过底视图

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

4

6 回答 6

27

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

  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;
    }
    
于 2013-02-09T14:56:52.563 回答
16

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

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
   shouldReceiveTouch:(UITouch *)touch;
于 2013-02-08T12:40:02.533 回答
9

斯威夫特 3 版本:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if theView.bounds.contains(touch.location(in: theView)) {
        return false
    }
    return true
}
于 2016-11-30T03:38:06.037 回答
5

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

extension ViewController: UIGestureRecognizerDelegate {
    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
        return !CGRectContainsPoint(menuView.bounds, touch.locationInView(menuView))
    }
}
于 2016-05-19T00:53:50.923 回答
3

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

前任

sidePanel.userInteractionEnabled = NO;
于 2013-02-08T12:54:55.170 回答
1

我已经做到了,在帮助下

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

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

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

它通过与事件同步来识别手势。

于 2013-02-08T14:33:35.427 回答