美文网首页
学习分享---自定义TableView拖拽排序

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

作者: MissLu16 | 来源:发表于2018-08-07 17:54 被阅读0次

    自定义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拖拽排序

          本文链接:https://www.haomeiwen.com/subject/iqjgjftx.html