自定义TableView,cell拖拽排序--学习一角(cell可为系统UITableViewCell,也可为自定义,tableview也为自定义)
最近做的一个智能家居类的项目,关于智能场景编辑这块,有牵扯到自定义tableviewcell加拖拽排序功能,所以特意学习了下,此篇文章作学习总结,分享给大家。
其实拖拽排序的思路,大体是这样的:(此时的拖拽排序是不分组插入法,注意不是交换)
隐藏选中的cell,用UIImageView来代替它,然后被拖来拖去。拖动的过程中如果到了一个新的位置,则更新dataSouce,并重新加载tableView,直至松手。松手后,移除替身UIImageView,正常显示所有的cell即可。
实现的步骤为:
设置一个用来保存被拖动的cell位置的变量editingIndexPath,初始为nil。在生产cell的过程中,如果editingIndexPath不为空,则隐藏该位置的cell
设置一个用来保存上次手指所在位置的变量lastIndexPath
为tableView添加 UILongPressGestureRecognizer
在手势的state为UIGestureRecognizerStateBegan 时:(刚按下去)
使用[recognizer locationInView:tableView]; 得到按下的坐标
使用[tableView indexPathForRowAtPoint:point];得到该坐标所在的indexPath
将editingIndexPath与lastIndexPath设置为indexPath,重新加载tableView
得到该cell的快照imageView(本例中cell本身就是图片),并设置其center
在手势的state为UIGestureRecognizerStateChanged时:(拖动)
获取新的坐标,设置imageView的center,使其实时随手移动
计算新的indexPath ,判断是不是和lastIndexPath相等,如果不相等,说明图片拖到了一个新的位置,此时需要将dataSource中两个位置的数据进行交换,令editingIndexPath = lastIndexPath,并重新加载tableView
更新lastIndexPath
在手势的state为UIGestureRecognizerStateEnded时:(松手)
将 imageView移除
将editingIndexPath设为nil,并重新加载tableView
对于滑动到tableview的top和bottom边缘时,改变tableView的contentOffset,实现自动滚动,然后滚动tableview的同时也要执行插入操作。
大体思路,此处分享完毕。
简单分享一种自定义tableview的方法,代码贴上,如下:
1.采用自定义tableview,可以提供一个协议方法,例如:
@protocol XXTableViewDataSource
@required
/**将外部数据源数组传入,以便在移动cell数据发生改变时进行修改重排*/
- (NSArray*)originalArrayDataForTableView:(XXTableView*)tableView;
@end
@protocol XXTableViewDelegate
@required
/**将修改重排后的数组传入,以便外部更新数据源*/
- (void)tableView:(XXTableView*)tableView newArrayDataForDataSource:(NSArray*)newArray;
@optional
/**选中的cell准备好可以移动的时候*/
- (void)tableView:(XXTableView*)tableView cellReadyToMoveAtIndexPath:(NSIndexPath*)indexPath;
/**选中的cell正在移动,变换位置,手势尚未松开*/
- (void)cellIsMovingInTableView:(XXTableView*)tableView;
/**选中的cell完成移动,手势已松开*/
- (void)cellDidEndMovingInTableView:(XXTableView*)tableView;
@end
然后在.m里设置实现一些方法即可。