您可以通过 CocoaPods 安装 PDGestureTableView,在 Podfile 中添加以下内容
pod 'PDGestureTableView'
PDGestureTableViewCell 有 4 种可能的动作
firstLeftAction
secondLeftAction
firstRightAction
secondRightAction
动作应该这样设置
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]
cell.firstLeftAction = [PDGestureTableViewCellAction
actionWithIcon:[UIImage imageNamed:@"icon"]
color:[UIColor greenColor]
fraction:0.25
didTriggerBlock:^(PDGestureTableView *gestureTableView, NSIndexPath*indexPath) {
// Action for first left action triggering.
}];
cell.secondLeftAction = [PDGestureTableViewCellAction
actionWithIcon:[UIImage imageNamed:@"icon"]
color:[UIColor redColor]
fraction:0.7
didTriggerBlock:^(PDGestureTableView *gestureTableView, NSIndexPath*indexPath) {
// Action for second left action triggering.
}];
return cell;
}
icon
是该动作的 图标 UIImage。color
是动作 高亮 的 UIColor。fraction
指定了整个单元格宽度中动作将 被高亮显示 的部分。例如,如果您指定 0.5,则当单元格到达表格宽度的中间时动作将被高亮显示。didTriggerBlock
是当用户 释放单元格 时执行的块。didTriggerBlock
的动作。didTriggerBlock
可以包含您想要的任何动作,但除了您使用的动作之外,您必须使用以下动作之一
pushCellForIndexPath:completion
+ deleteCellForIndexPath:animation:completion
通常,您会使用这两个方法来删除由 NSFetchedResultsController
对象管理的数据源中的单元格。
第一个方法将把它推向表格视图的边缘,第二个会在 NSFetchedResultsController
委托方法中被调用。它对非手势删除也适用。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
[...]
__unsafe_unretained typeof(self) weakSelf = self; // Get a weak reference of self so you can access it from didTriggerBlock without creating retain cycles.
cell.firstLeftAction = [PDGestureTableViewCellAction
actionWithIcon:[UIImage imageNamed:@"icon"]
color:[UIColor greenColor]
fraction:0.25
didTriggerBlock:^(PDGestureTableView *gestureTableView, NSIndexPath*indexPath) {
NSManagedObject *object = [weakSelf.fetchedResultsController objectAtIndexPath:indexPath];
[weakSelf.fetchedResultsController deleteObject:object];
}];
return cell;
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch(type) {
[...]
case NSFetchedResultsChangeDelete:
[self.gestureTableView deleteCellForIndexPath:indexPath animation:UITableViewRowAnimationRight completion:nil];
break;
[...]
}
}
pushAndDeleteCellForIndexPath:completion:
此方法由上述两种方法组成。当您只想从未由NSFetchedResultsController
管理的数据表中删除单元格时,调用它。在调用之前,您必须从数据源中删除所有相关数据。
```objective-c
[...]
didTriggerBlock:^(PDGestureTableView *gestureTableView, NSIndexPath*indexPath) {
[dataArray removeObjectAtIndex:indexPath.row];
[gestureTableView beginUpdates];
[gestureTableView pushAndDeleteCellForIndexPath:indexPath completion:^{
// Cell deleted.
}];
[gestureTableView endUpdates];
}];
```
Notice you __must__ use `beginUpdates` and `endUpdates` methods before and after calling this method, respectively.
replaceCellForIndexPath:completion:
将单元格替换为其原始位置。
```objective-c
[...]
didTriggerBlock:^(PDGestureTableView *gestureTableView, NSIndexPath *indexPath) {
[gestureTableView replaceCellForIndexPath:indexPath completion:nil];
}];
```
如果不想在替换单元格时让其弹跳,请将cellBouncesWhenReplacing
设置为NO
。
此外,如果您想设置所有这些动画的持续时间,可以将animationsDuration
设置为所需的时间。
PDGestureTableView可在MIT许可证下使用。