在子视图控制器上禁用Tap手势?如何确定它是PanGesture还是TapGesture?

时间:2015-06-30 07:10:44

标签: ios objective-c xcode cocoa-touch uigesturerecognizer

所有

在我的iOS 8.0应用中。

在父子视图架构中。通过这段代码......

[self addChildViewController:slideTableViewController];
[self.view addSubview:slideTableViewController.view];
[slideTableViewController didMoveToParentViewController:self];

我已经实施了TapGesturerecognizer&基本视图控制器上的PanGesturerecognizer。

因此,它可以识别Pan(拖动)和Tap。我在BaseView上需要两个手势。

只是不想要点击手势 SlideView。 因为我想在子视图上执行didSelectRowAtIndexpath方法,

解决方案:

回答问题1: 许多StackOverflow答案具有​​相同的基础.. 触摸遇到子视图时禁用点按手势。

if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]){
                if(CGRectContainsPoint(slideTableViewController.view.frame,[touch locationInView:self.view])){
                    return NO;
     }
}

回答问题2:

如何确定它是PanGesture还是TapGesture?

对于每个手势类型,委托方法将调用

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

如果您在视图中实现了两个手势,请平移手势和触摸手势,

此方法将调用2次,平移手势1次,点按手势1次。

因此,在此方法中,您可以检查isKindOfClass方法。

非常感谢您的帮助......

enter image description here

5 个答案:

答案 0 :(得分:4)

只需设置tapGesture.cancelsTouchesInView = YES;

即可

答案 1 :(得分:3)

您可以在baseViewController

中实施手势的委托方法
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizershouldReceiveTouch:(UITouch *)touch {
    return touch.view == self.view;
}

OR //如果它是一个Tap Gesture,你的触摸与一个特定的视图相交,为此我们有这个方法。

if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]){
                if(CGRectContainsPoint(slideTableViewController.view.frame,[touch locationInView:self.view])){
                    return NO;
     }
}

答案 2 :(得分:0)

我在UIViews中做到了这一点我希望这可以帮到你:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

UITouch *touch = [touches anyObject];
[touch locationInView:self.view];
if(touch.view == self.topView )
{
     //just return
}
if(touch.view == SOSTopView )
{
   //just return
}
}

答案 3 :(得分:0)

看起来你应该实现UITableViewDelegate的这种方法:

- (NSIndexPath *)tableView:(UITableView *)tableView
  willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // you can add some logic here
    return nil;
}

这将阻止选择任何行。

答案 4 :(得分:-1)

您是否可以使用userInteractionEnabled属性?所以你可以做到以下几点:

slideTableViewController.userInterationEnabled = NO;