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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简介 <<UITableView(或简单地说,表视图)的一个实例是用于显示和编辑分层列出的信息的一种手段 <<...
    无邪8阅读 10,706评论 3 3
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,646评论 8 265
  • 概述在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似...
    liudhkk阅读 9,093评论 3 38
  • Cycript的一些使用方法 前言:最近在搞逆向的一些东西,不免会用到这些,将遇到的坑以及思路整理一下,好让别人不...
    YxYYxY阅读 4,721评论 0 2