學(xué)習(xí)分享---自定義TableView拖拽排序

自定義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)一些方法即可。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、簡(jiǎn)介 <<UITableView(或簡(jiǎn)單地說(shuō),表視圖)的一個(gè)實(shí)例是用于顯示和編輯分層列出的信息的一種手段 <<...
    無(wú)邪8閱讀 10,968評(píng)論 3 3
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,685評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,282評(píng)論 8 265
  • 概述在iOS開(kāi)發(fā)中UITableView可以說(shuō)是使用最廣泛的控件,我們平時(shí)使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,307評(píng)論 3 38
  • Cycript的一些使用方法 前言:最近在搞逆向的一些東西,不免會(huì)用到這些,將遇到的坑以及思路整理一下,好讓別人不...
    YxYYxY閱讀 4,853評(píng)論 0 2

友情鏈接更多精彩內(nèi)容