BMDragCellCollectionView 1.1.4

BMDragCellCollectionView 1.1.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新版本2017年11月

asiosldh 维护。



  • idhong

BMDragCellCollectionView

Version


Support
Weibo
GitHub stars

前言

最近公司准备做一个类似支付宝 UICollectionViewCell 拖拽重排的功能,UICollectionViewCell 的任意拖拽排列,支付宝最新的版本已去掉了任意拖拽功能,而只是对常用功能进行拖拽重排,没有出现超出屏幕的情况。个人感觉应该更好,毕竟太多功能去拖拽重排对用户来说是一个特别大的工作量,只需把常用功能提即可。相应的功能点还是在对应的分组里,至于我们的需求暂时不怎么清楚,使用还是研究下任意拖拽吧。

同款的 Swift 版本

声明

此库在 https://github.com/wazrx/XWDragCellCollectionView 的基础上进行了一系列优化及丰富 API,向前人致敬。

未来计划

  • Swift 版本
  • 演示及文档完善。
  • 支付宝 拖拽效果实现,资源来源于 http://www.iconfont.cn/ 感谢。
  • 今日头条 频道拖拽重排效果实现。
  • 腾讯新闻 频道拖拽重排效果实现。
  • 看荐 拖拽重排效果实现及优化。ps:看荐 的拖拽重排发现一个 bug,哈哈。
  • 您认为有必要的也 @ 我哈。

效果图

视频演示

在线视频演示

注意事项

BMDragCellCollectionView 基于 Xcode 8.2.1, iOS 6+ ARC,请使用最新正式版来编译 BMDragCellCollectionView,旧版本的 Xcode 有效,但不保证会出现一些兼容性问题。

开源不易,来个 star 鼓励下吧

演示运行

  1. cd BMDragCellCollectionView/BMDragCellCollectionViewDemo

  2. open BMDragCellCollectionViewDemo.xcodeproj

集成

CocoaPods

推荐使用 CocoaPods 安装,Cocoapods 的使用请点这里 链接1链接2链接3

  1. Podfile 中添加 `pod 'BMDragCellCollectionView' Version
  2. 执行 pod installpod update
  3. 使用的地方导入 "BMDragCellCollectionView.h"
  4. 如果无法找到 BMDragCellCollectionView,可用 pod setuprm ~/Library/Caches/CocoaPods/search_index.json,然后在 pod search BMDragCellCollectionView

手动安装

  1. 通过 Clonedownload 下载 BMDragCellCollectionView 文件夹内的所有内容。
  2. 将 BMDragCellCollectionView 内的源文件添加(拖放)到您的工程中。
  3. 导入 "BMDragCellCollectionView.h"

基本使用

  • 在需要使用长按拖拽 UICollectionView 的地方使用 BMDragCellCollectionView 代替,用法和 UICollectionView 一样。
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
BMDragCellCollectionView *collectionView = [[BMDragCellCollectionView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT) collectionViewLayout:layout];
collectionView.delegate = self;
collectionView.dataSource = self;
[self.view addSubview:collectionView];
  • 实现 BMDragCollectionViewDataSource 协议的如下方法

此协议用于在交换时获取数据源,内部做数据源操作。

- (NSArray *)dataSourceWithDragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView {
    return self.dataSource;
}
  • 实现 BMDragCellCollectionViewDelegate 协议的如下方法

此协议用于在在内部处理好数据源时通知使用者更新数据源。

- (void)dragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView newDataArrayAfterMove:(NSArray *)newDataArray {
    self.dataSource = [newDataArray mutableCopy];
}

BMDragCellCollectionView 属性及方法说明

长按触发时间,默认是 0.5 秒,建议根据实际情况设值

@property (nonatomic, assign) NSTimeInterval minimumPressDuration;

是否可以拖拽 默认为 YES

@property (nonatomic, assign, getter=isCanDrag) BOOL canDrag;

长按拖拽时 Cell 缩放比例 默认是:1.2

@property (nonatomic, assign) CGFloat dragZoomScale;

拖拽的 Cell 在拖拽移动时的透明度 默认是:1.0

@property (assign, nonatomic) CGFloat dragCellAlpha;

使用者想移动到指定位置操作时

- (void)dragMoveItemToIndexPath:(NSIndexPath *)indexPath;

代理方法

当一个 Cell 将要开始拖拽时调用询问是否可以拖拽, YES: 可以, NO: 不可以,默认是 YES

- (BOOL)dragCellCollectionViewShouldBeginMove:(BMDragCellCollectionView *)dragCellCollectionView indexPath:(NSIndexPath *)indexPath;

当将要交换时,询问是否可以交换时调用询问是否可以交换, YES: 可以, NO: 不可以,默认是 YES

- (BOOL)dragCellCollectionViewShouldBeginExchange:(BMDragCellCollectionView *)dragCellCollectionView sourceIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

完成重排时,重排成成功时

- (void)dragCellCollectionViewDidEndDrag:(BMDragCellCollectionView *)dragCellCollectionView;

下面的三个方法在手势拖拽变化时调用,开始拖拽 正在拖拽 结束拖拽

- (void)dragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView beganDragAtPoint:(CGPoint)point   indexPath:(NSIndexPath *)indexPath;

- (void)dragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView changedDragAtPoint:(CGPoint)point indexPath:(NSIndexPath *)indexPath;

- (void)dragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView endedDragAtPoint:(CGPoint)point   indexPath:(NSIndexPath *)indexPath;

结束拖拽时时是否内部自动处理,在一些需要特殊需求时可以在此方法做,如:今日头条当第一组拖拽到第二组((默认是不交换处理的)松手时需要自动把此 Cell 移动到第二组中的同步或者尾部。那可在此方法返回 NO,同时调用 - (void)dragMoveItemToIndexPath:(NSIndexPath *)indexPath; 方法完成移动

- (BOOL)dragCellCollectionView:(BMDragCellCollectionView *)dragCellCollectionView endedDragAutomaticOperationAtPoint:(CGPoint)point section:(NSInteger)section indexPath:(NSIndexPath *)indexPath;

期待

  • 如果在使用过程中遇到 Bug,希望您能 Issues 我。

版本历史

  • v1.1.4
  • v1.1.3
  • v1.1.2
  • v1.1.1
  • v1.1.0
  • v1.0.9
  • v1.0.8
  • 版本1.0.7
  • 版本1.0.6
  • 版本1.0.5
  • 版本1.0.4
  • 版本1.0.3
  • 版本1.0.2
  • 版本1.0.1
  • 版本1.0.0

MIT

BMDragCellCollectionView使用MIT许可证,详情请见LICENSE文件