在嵌入UIScrollView的UITableView中滑动以删除

时间:2012-07-08 01:22:43

标签: ios uitableview ios5 ios4 uiscrollview

我遇到了与UIScrollview enable delete row by swipe相同的问题   它是一个tableView,另一个视图作为scrollView的子视图工作,在我将scrollView的 scrollEnable 属性设置为 NO 之前,我无法启用“滑动删除” ,但它带来了另一个问题:我无法在tableView和另一个视图之间滑动 除了设置 scrollEnable 属性以启用“滑动删除”之外,还有其他方法吗?
如果没有,我应该何时设置self.scrollEnable = NO,何时应将self.scrollEnable = YES设置为“滑动删除”和“在视图之间滑动”两者都可以正常工作?

谢谢

5 个答案:

答案 0 :(得分:6)

我成功使用了

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

在包含tableview的UIScrollView子类中,使得驻留在tableview中的UISwipeGestureRecognizer能够触发而不被“主”scrollview的手势识别器吞没。

答案 1 :(得分:6)

您需要使用UIScrollView的自定义子类。它应该适用于水平滚动视图中的表视图:

@interface MyCoolScrollView : UIScrollView

@end

@implementation MyCoolScrollView

// Allows inner UITableView swipe-to-delete gesture
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(nonnull UIGestureRecognizer *)otherGestureRecognizer
{
    return [otherGestureRecognizer.view.superview isKindOfClass:[UITableView class]];
}

@end

答案 2 :(得分:4)

如果,我没有弄错,滚动视图会消耗这些触摸,并且表格的编辑没有发生,因为表格没有触及。这可以通过继承UIScrollView来解决,以便将触摸发送给下一个响应者。所以这只是覆盖touchesBegan,移动和结束的问题。今天晚些时候将使用所需的代码更新答案,因为我现在正在路上。干杯!

编辑:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if(!self.dragging)
    {
        [self.nextResponder touchesMoved:touches withEvent:event];
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesEnded:touches withEvent:event];
}

只需创建一个继承自UIScrollView的类,并在实现中删除此代码。这将使scrollView不会吞下触摸,但会传递它们。显然,在创建scrollView时,请使用刚刚创建的类而不是UIScrollView。 抱歉耽搁了。希望这会有所帮助。

干杯!

答案 3 :(得分:3)

@ THOR的答案还可以,但如果UITableView位于UIScrollView,那么您可能还有另一个UIView。向上滚动tableview时,您不小心滑到"其他视图"。

这样可以防止滑动,并允许您滑动以删除。

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (gestureRecognizer.state != 0) {
        return YES;
} else {
    return NO;
}

}

答案 4 :(得分:0)

我知道这个线程很旧,但是这里是swift 4版本,可以在iOS 11中为我工作(您可以将UIScrollView子类化):

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if (otherGestureRecognizer.view != nil && otherGestureRecognizer.view!.superview != nil) {
        return otherGestureRecognizer.view!.superview!.isKind(of: UITableView.self)
    }

    return false
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if (gestureRecognizer.state != .possible) {
        return true
    }

    return false
}