iOS中UITableView左滑删除的手势冲突问题

4
我有一个手势识别问题。我的目标是在表视图中实现滑动删除,但我认为其他手势存在冲突。我正在使用这个库romaonthego/REFrostedViewController,这是一个汉堡菜单的库,它具有 pangesture 功能。我认为冲突出现在手势之间。因为当我在另一个项目中运行我的表格视图代码时,它可以正常工作。请帮忙解决,谢谢。

我认为...你必须禁用 "panGestureEnabled" 并手动呈现 "menu" [self.frostedViewController presentMenuViewController]; - TonyMkenu
但我还需要平移手势。我禁用了平移手势,但它根本不起作用。我看到一些应用程序在菜单上使用平移手势和手势删除表格中的数据。我想知道他们是如何处理两个平移手势的。T_T - Alvin John Tandoc
但是...你遇到了什么冲突?你不能呈现菜单...还是你不能滑动单元格? - TonyMkenu
我无法滑动单元格。 - Alvin John Tandoc
嘿,伙计,你是怎么解决这个问题的? - Viraj Padsala
4个回答

4

编辑:已更新至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。可能会有用!


UITableViewWrapperView在iOS 11中不再使用。有人在iOS 11中成功实现了吗? - thejaz
@thejaz 我更新了我的答案,针对iOS 11,希望有所帮助! - beebcon
仍然对我没有运气。 - famfamfam

4
我曾遇到过类似的问题,最终我解决方式与TonyMkenu相似,但你需要允许更多的识别器:
- (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中,希望这可以帮助你。
- (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;
}

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://dev59.com/P23Xa4cB1Zd3GeqPcTop#14338043


那么...你有什么新消息吗? - TonyMkenu
抱歉回复晚了,我已经通过引用汉堡菜单手势来解决我的问题。谢谢你的答案 :) - Alvin John Tandoc
@AlvinJohnTandoc 我在我的当前项目中遇到了类似的问题。我假设TonyMkenu提供的解决方案对您有用。如果我的假设是正确的,您能告诉我在哪里放置代码(答案中提供的函数)吗?现在我的代码没有使用这些函数。所以我应该把它放在菜单类还是自己的视图控制器类中? - Dipak Mishra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接