自定義TableView,cell拖拽排序--學(xué)習(xí)一角(cell可為系統(tǒng)UITableViewCell,也可為自定義,tableview也為自定義)
最近做的一個(gè)智能家居類的項(xiàng)目,關(guān)于智能場(chǎng)景編輯這塊,有牽扯到自定義tableviewcell加拖拽排序功能,所以特意學(xué)習(xí)了下,此篇文章作學(xué)習(xí)總結(jié),分享給大家。
其實(shí)拖拽排序的思路,大體是這樣的:(此時(shí)的拖拽排序是不分組插入法,注意不是交換)
隱藏選中的cell,用UIImageView來(lái)代替它,然后被拖來(lái)拖去。拖動(dòng)的過(guò)程中如果到了一個(gè)新的位置,則更新dataSouce,并重新加載tableView,直至松手。松手后,移除替身UIImageView,正常顯示所有的cell即可。
實(shí)現(xiàn)的步驟為:
設(shè)置一個(gè)用來(lái)保存被拖動(dòng)的cell位置的變量editingIndexPath,初始為nil。在生產(chǎn)cell的過(guò)程中,如果editingIndexPath不為空,則隱藏該位置的cell
設(shè)置一個(gè)用來(lái)保存上次手指所在位置的變量lastIndexPath
為tableView添加?UILongPressGestureRecognizer
在手勢(shì)的state為UIGestureRecognizerStateBegan?時(shí):(剛按下去)?
使用[recognizer locationInView:tableView];?得到按下的坐標(biāo)
使用[tableView indexPathForRowAtPoint:point];得到該坐標(biāo)所在的indexPath
將editingIndexPath與lastIndexPath設(shè)置為indexPath,重新加載tableView
得到該cell的快照imageView(本例中cell本身就是圖片),并設(shè)置其center
在手勢(shì)的state為UIGestureRecognizerStateChanged時(shí):(拖動(dòng))?
獲取新的坐標(biāo),設(shè)置imageView的center,使其實(shí)時(shí)隨手移動(dòng)
計(jì)算新的indexPath?,判斷是不是和lastIndexPath相等,如果不相等,說(shuō)明圖片拖到了一個(gè)新的位置,此時(shí)需要將dataSource中兩個(gè)位置的數(shù)據(jù)進(jìn)行交換,令editingIndexPath = lastIndexPath,并重新加載tableView
更新lastIndexPath
在手勢(shì)的state為UIGestureRecognizerStateEnded時(shí):(松手)?
將?imageView移除
將editingIndexPath設(shè)為nil,并重新加載tableView?
對(duì)于滑動(dòng)到tableview的top和bottom邊緣時(shí),改變tableView的contentOffset,實(shí)現(xiàn)自動(dòng)滾動(dòng),然后滾動(dòng)tableview的同時(shí)也要執(zhí)行插入操作。
大體思路,此處分享完畢。
簡(jiǎn)單分享一種自定義tableview的方法,代碼貼上,如下:
1.采用自定義tableview,可以提供一個(gè)協(xié)議方法,例如:
@protocol ?XXTableViewDataSource
@required
/**將外部數(shù)據(jù)源數(shù)組傳入,以便在移動(dòng)cell數(shù)據(jù)發(fā)生改變時(shí)進(jìn)行修改重排*/
- (NSArray*)originalArrayDataForTableView:(XXTableView*)tableView;
@end
@protocol ?XXTableViewDelegate
@required
/**將修改重排后的數(shù)組傳入,以便外部更新數(shù)據(jù)源*/
- (void)tableView:(XXTableView*)tableView newArrayDataForDataSource:(NSArray*)newArray;
@optional
/**選中的cell準(zhǔn)備好可以移動(dòng)的時(shí)候*/
- (void)tableView:(XXTableView*)tableView cellReadyToMoveAtIndexPath:(NSIndexPath*)indexPath;
/**選中的cell正在移動(dòng),變換位置,手勢(shì)尚未松開(kāi)*/
- (void)cellIsMovingInTableView:(XXTableView*)tableView;
/**選中的cell完成移動(dòng),手勢(shì)已松開(kāi)*/
- (void)cellDidEndMovingInTableView:(XXTableView*)tableView;
@end
然后在.m里設(shè)置實(shí)現(xiàn)一些方法即可。