UICollectionView Cell 任意拖拽重排
写在前面
最近公司准备做一个类似支付宝
UICollectionViewCell
拖拽重排的功能,UICollectionViewCell
的任意拖拽排列,支付宝最新的版本已去掉了任意拖拽功能,而只是对常用功能进行拖拽重排,没有出现超出屏幕的情况。个人感觉应该更好,毕竟太多功能去拖拽重排对用户来说是一个特别大的工作量,只需把常用功能提即可。相应的功能点还是在对应的分组里,至于我们的需求暂时不怎么清楚,使用还是研究下任意拖拽吧。
未来计划
- [ ] Demo及文档完善。
- [ ]
支付宝
拖拽效果实现。 - [x]
今日头条
频道拖拽重排效果实现。 - [ ]
看荐
拖拽重排效果实现及优化。ps:看荐
的拖拽重排发现一个bug,哈哈。
效果图
效果1
效果2
效果3
基本实现了
头条
的频道重排功能,额外增加了当拖拽到边沿时自动滚动的功能。
视频演示
须知
BMDragCellCollectionView
基于Xcode 8.2.1 , iOS 6+ ARC
,请使用最新正式版来编译BMDragCellCollectionView
,旧版本的Xcode
有效,但不保证会出现一些兼容性问题。
开源不易,来个star鼓励下吧
Demo运行
老提不要说不会
Cocoapods
-
cd BMDragCellCollectionView/BMDragCellCollectionViewDemo
-
pod install
-
open BMDragCellCollectionViewDemo.xcworkspace
集成
CocoaPods
推荐使用 CocoaPods 安装。
- 在
Podfile
中添加pod 'BMDragCellCollectionView', '1.0.4'
Version - 执行
pod install
或pod update
- 使用的地方导入
"BMDragCellCollectionView.h"
- 如果无法找到
BMDragCellCollectionView
可用pod setup
或rm ~/Library/Caches/CocoaPods/search_index.json
在pod search BMDragCellCollectionView
手动安装
- 通过
Clone
或者download
下载BMDragCellCollectionView
文件夹内的所有内容。 - 将 BMDragCellCollectionView 内的源文件添加(拖放)到你的工程。
- 导入
"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;
代理方法
当一个
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;
- 其他相关用法,详见代码
- cocoapods在线文档
期待
- 如果在使用过程中遇到BUG,希望您能Issues我。
版本历史
v1.0.4
v1.0.3
v1.0.2
v1.0.1
v1.0.0
MIT
BMDragCellCollectionView
使用 MIT 许可证,详情可见 LICENSE 文件
声明
感谢收看,有任何疑问和建议可在下方留言(如果不显示评论,搭个梯子就有了),欢迎Github点Star😁,本文发布于梁大红的技术Blog,转载注明出处即可。