在子视图控制器上禁用点击手势?如何判断是PanGesture还是TapGesture?
Disable Tap Gesture on Child View Controller? How to determine Is it a PanGesture or TapGesture?
全部。
在我的 iOS 8.0 应用程序中。
在父子视图架构中。通过这个代码...
[self addChildViewController:slideTableViewController];
[self.view addSubview:slideTableViewController.view];
[slideTableViewController didMoveToParentViewController:self];
我已经在基本视图控制器上实现了 TapGesturerecognizer 和 PanGesturerecognizer。
因此,它可以识别平移(拖动)和点击。我的 BaseView 需要两种手势。
只是不想在 SlideView
上点击手势。
因为我想在子视图上执行 didSelectRowAtIndexpath 方法,
解法:
问题 1 的答案:
许多 Whosebug 答案具有相同的基础......
当触摸遇到子视图时禁用点击手势。
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
方法一样进行检查。
非常感谢您的帮助......
只需设置tapGesture.cancelsTouchesInView = YES;
没有一个userInteractionEnabled
属性可以利用吗?所以你可以这样做:
slideTableViewController.userInterationEnabled = NO;
我已经在 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
}
}
您可以在 baseViewController
中实现手势的委托方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizershouldReceiveTouch:(UITouch *)touch {
return touch.view == self.view;
}
或
//如果是点击手势并且你的触摸与特定视图相交,为此我们有这个方法。
if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]){
if(CGRectContainsPoint(slideTableViewController.view.frame,[touch locationInView:self.view])){
return NO;
}
}
看起来你应该实现 UITableViewDelegate
的这个方法:
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// you can add some logic here
return nil;
}
这将阻止选择任何行。
全部。
在我的 iOS 8.0 应用程序中。
在父子视图架构中。通过这个代码...
[self addChildViewController:slideTableViewController];
[self.view addSubview:slideTableViewController.view];
[slideTableViewController didMoveToParentViewController:self];
我已经在基本视图控制器上实现了 TapGesturerecognizer 和 PanGesturerecognizer。
因此,它可以识别平移(拖动)和点击。我的 BaseView 需要两种手势。
只是不想在 SlideView
上点击手势。
因为我想在子视图上执行 didSelectRowAtIndexpath 方法,
解法:
问题 1 的答案: 许多 Whosebug 答案具有相同的基础...... 当触摸遇到子视图时禁用点击手势。
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
方法一样进行检查。
非常感谢您的帮助......
只需设置tapGesture.cancelsTouchesInView = YES;
没有一个userInteractionEnabled
属性可以利用吗?所以你可以这样做:
slideTableViewController.userInterationEnabled = NO;
我已经在 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
}
}
您可以在 baseViewController
中实现手势的委托方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizershouldReceiveTouch:(UITouch *)touch {
return touch.view == self.view;
}
或 //如果是点击手势并且你的触摸与特定视图相交,为此我们有这个方法。
if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]){
if(CGRectContainsPoint(slideTableViewController.view.frame,[touch locationInView:self.view])){
return NO;
}
}
看起来你应该实现 UITableViewDelegate
的这个方法:
- (NSIndexPath *)tableView:(UITableView *)tableView
willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// you can add some logic here
return nil;
}
这将阻止选择任何行。