学习分享---自定义TableView拖拽排序

自定义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里设置实现一些方法即可。

你可能感兴趣的:(学习分享---自定义TableView拖拽排序)