PDGestureTableView 2.1

PDGestureTableView 2.1

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布日期最新发布2014年12月

未指派 维护。




  • By
  • David Román


PDGestureTableView

特性

  • 滑动单元格执行多个操作。
  • 按住并拖动以移动单元格。
  • 可以将 UIView 设置为在表格视图中没有内容时显示。
  • Storyboards/XibsAutolayout 完全兼容。
  • 基于块。没有愚蠢的委托 :)

CocoaPods

您可以通过 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设置为所需的时间。

愿望清单

  • 当当前移动的单元格接近表格视图边缘时自动滚动。
  • 当到达最后一个动作时单元格弹跳。

需求

  • iOS 7或更高版本。
  • 自动引用计数(ARC)。

许可证

PDGestureTableView可在MIT许可证下使用。

此外,我非常想知道您是否在您的任何项目中使用了它,所以发送给我电子邮件推文,让我的日子变得更好:)