滑动以删除行,而无需点击删除按钮
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 单元格