滑动以删除行,而无需点击删除按钮

Posted

技术标签:

【中文标题】滑动以删除行,而无需点击删除按钮【英文标题】:Swipe to delete row without having to hit the delete button 【发布时间】:2014-01-17 22:36:58 【问题描述】:

我知道滑动删除功能的工作原理,但我不太确定如何制作它,而不是让删除按钮出现删除,我宁愿让它在滑动时删除单元格左侧或右侧的单元格。

这是我让单元格向左注册向左滑动手势的地方:

    UISwipeGestureRecognizer* swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeft:)];
    [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
    [cell addGestureRecognizer:swipeLeft];

这里是选择器的方法:

- (void)swipeLeft:(UIGestureRecognizer *)gestureRecognizer 
    if (gestureRecognizer.state == UIGestureRecognizerStateEnded) 
        UITableViewCell *cell = (UITableViewCell *)gestureRecognizer.view;
        NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];

    

现在从 UITableview 删除单元格时它工作得很好;但是,我需要一个动画来显示单元格向左移动一定距离然后删除。我没有什么删除按钮。

编辑:这是带有动画的删除行:

    [self.tableView deleteRowsAtIndexPaths:@[indexPath]
                          withRowAnimation:UITableViewRowAnimationLeft];

    [self.tableView reloadData];

这个删除很好,但是我可以让它像淡入淡出动画一样创建,还是我可以修改它,以便在滑动指定距离后提交删除?

【问题讨论】:

您想在邮箱应用程序中执行类似操作以删除邮件吗? 对,但我希望它只是自动删除而不是通过按下其中任何一个按钮来确认,而不是出现“更多”和“存档”。 所以当用户不小心做了滑动动作时,您想删除数据而没有机会中止吗?不是一个好主意。但是,如果您真的想这样做,请不要使用标准的滑动删除。为每个单元格添加您自己的滑动手势。 对,这就是我已经做过的事情,但是一旦他们滑动它就会删除而没有任何类型的动画。我想看到整个单元格连同它的所有内容一起向左移动。 如果它在没有动画的情况下删除,那么您选择这样做。而是删除带有动画的行。如果您需要帮助,请发布您的删除代码。 【参考方案1】:

这是我为静态表格视图制作的自定义滑动,但应该适用于动态表格视图。它将允许您滑动到设置的最大 x 位置。如果用户释放它,它将动画回到原来的位置。

我已经调整了代码,使其可以与动态单元格一起使用。但尚未测试。

添加这个本地变量

@property (nonatomic) CGFloat changeX;

只需将 pan GR 连接到情节提要并连接到此动作。

- (IBAction)dragCell:(UIPanGestureRecognizer *) gestureRecognizer

    CGPoint swipeLocation = [gestureRecognizer locationInView:self.tableView];
    NSIndexPath *swipedIndexPath = [self.tableView indexPathForRowAtPoint:swipeLocation];
    UITableViewCell*swipedCell = [self.tableView cellForRowAtIndexPath:swipedIndexPath];

    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
        self.changeX = swipeLocation.x;
    
    if (gestureRecognizer.state == UIGestureRecognizerStateChanged) 
        CGFloat maxRight = 100; // change this to increase distance of hit point
        CGFloat newX = swipeLocation.x - self.changeX; // relative from first touch location
        if (newX <= 0) newX = 0;
        if (newX >= maxRight) 
            newX = maxRight;
            NSLog(@"Hit the point where I'll allow delete");
        
        swipedCell.frame = CGRectMake(newX, swipedCell.frame.origin.y, swipedCell.frame.size.width, swipedCell.frame.size.height);
    

    if (gestureRecognizer.state == UIGestureRecognizerStateEnded || gestureRecognizer.state == UIGestureRecognizerStateCancelled) 

        [UIView animateWithDuration:0.5 animations:^
            swipedCell.frame = CGRectMake(0, swipedCell.frame.origin.y, swipedCell.frame.size.width, swipedCell.frame.size.height);
        
        completion:^(BOOL finished) 
            //
        ];
    

【讨论】:

太棒了!我确实有一个关于 self.changeX 到底是什么的问题? 好的,我看到它是 CGFloat changeX (delta) 以便为 newX 创建两者的差异。奇怪的是,这真的很好用!太棒了!不过,出于某种原因,它不会删除我正在拖动的单元格。它是它删除的堆栈的底部,但这就是我的全部。感谢您的帮助!【参考方案2】:

不要调用 reloadData。它杀死了动画。

【讨论】:

以上是关于滑动以删除行,而无需点击删除按钮的主要内容,如果未能解决你的问题,请参考以下文章

通过点击 iOS 中的红色减号图标来删除 tableview 单元格

UI测试滑动删除表格视图单元格

使带有删除按钮的 UITableView 对所有单元格可见

UITableView 单手势行滑动动作

向左滑动时未剪切子视图以删除 UITableViewCell

以编程方式在 UITableViewCell 上显示删除按钮