2014-08-27 146 views
4

我的手势识别器有问题。我的目标是实现在我的表格视图中使用滑动删除。但我认为其他手势彼此冲突。我正在使用这个库romaonthego/REFrostedViewController 这是我的汉堡菜单的一个库,这个库有一个pangesture功能。我认为冲突是在手势中。因为当我在另一个项目中运行我的tableview代码时,它正在工作。请帮助,谢谢您。手势冲突UITableView滑动删除iOS

+0

我认为...你必须禁用“panGestureEnabled”并手动呈现“菜单”[self.frostedViewController presentMenuViewController]; – TonyMkenu 2014-08-27 11:49:55

+0

但我也需要平移手势。我禁用了平移手势,但它根本不工作。我看到一些应用程序在那里使用平移手势菜单和手势来删除表中的数据。我想知道他们是如何管理两轮2平移手势。 T_T – 2014-08-27 11:53:39

+0

但是..你有什么冲突?您无法呈现菜单......或者您无法滑动单元格? – TonyMkenu 2014-08-27 12:54:57

回答

0

首先...看看,如果你有这个

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the specified item to be editable. 
    return YES; 
} 

和第二...

尝试添加该

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

    if ([gestureRecognizer.view isKindOfClass:[UITableView class]]) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

https://stackoverflow.com/a/14338043

+0

那么...你有什么消息吗? – TonyMkenu 2014-09-04 10:00:27

+0

对不起,我已经通过参考汉堡菜单的手势来解决我的问题。谢谢你的回答:) – 2014-10-09 01:44:59

+0

@AlvinJohnTandoc我在当前的项目中遇到类似的问题。我假设TonyMkenu提供的解决方案为您工作。如果我的假设是正确的,你能否告诉我该把代码放在哪里(功能在答案中提供)?现在我的代码不会在任何地方使用这些函数。那么我应该把它放在菜单类还是我自己的视图控制器类中? – 2015-05-29 12:47:44

3

我有一个类似的问题,我最终做的和TonyMkenu类似,但是有更多的认识者认为y OU需要允许:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

if (otherGestureRecognizer.delegate == self) 
    return NO; 

//if otherGestureRecognizer is swipe to delete from a UITableView cancel slide menu recognizers 

if ([[otherGestureRecognizer.view class] isSubclassOfClass:[UITableView class]]) 
{ 
    NSLog(@"Allow1 %@", [otherGestureRecognizer description]); 

    return YES; 
} 

if([[otherGestureRecognizer.view class] isSubclassOfClass:[UITableViewCell class]] || 
[NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewCellScrollView"] || 
[NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewWrapperView"]) 
{ 
    NSLog(@"Allow&Disable %@", [otherGestureRecognizer description]); 

    if(gestureRecognizer.delegate == self) 
    {//cancel the slide menu recognizer 

     gestureRecognizer.enabled = NO; 
     gestureRecognizer.enabled = YES; 
    } 

    return YES; 
} 

NSLog(@"Deny %@", [otherGestureRecognizer description]); 
return NO; 

}

2

编辑:更新了iOS的11

其他的答案是有帮助的,但对我来说最好的解决办法是应该做的逻辑shouldRequireFailureOfOtherGesture像所以:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if (gestureRecognizer == self.pan) { 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if (gestureRecognizer == self.pan) { 

     // iOS 10 
     if ([NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewWrapperView"]) { 
      return YES; 
     } 
     // iOS 11 
     else if ([otherGestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer.view isKindOfClass:[UITableView class]]) { 
      return YES; 
     } 
    } 
    return NO; 
} 

这在我的情况下有更好的行为。我还在我的平底锅手势上使用了delaysTouchesBegan = YES。可能有用!

+0

UITableViewWrapperView未在iOS 11中使用。任何人都可以在iOS 11中使用它? – thejaz 2017-10-21 14:12:04

+0

@thejaz我更新了我的答案iOS 11,希望有帮助! – beebcon 2017-10-25 14:26:13

0

在iOS 11中,希望这可以帮助你。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if ([[otherGestureRecognizer.view class] isSubclassOfClass:[UITableView class]]) { 
     if ([otherGestureRecognizer isKindOfClass: [UIPanGestureRecognizer class]]) { 
      UIPanGestureRecognizer *otherPan = (UIPanGestureRecognizer *)otherGestureRecognizer; 
      CGPoint translation = [otherPan translationInView:otherGestureRecognizer.view]; 
      return translation.x < 0; 
     } 
    } 
    return NO; 
}