利用長按手勢移動TableView中的Cell

2021-07-02 22:15:13 字數 2603 閱讀 2312

需要什麼?

uilonggesturerecognizer

uitableview(可以用uicollectionview代替)

uitableviewcontroller(可以用uiviewcontroller 或 uicollectionviewcontroller)

首先給 table view 新增乙個uilonggesturerecognizer。可以在 table view controller 的viewdidload方法中新增。

uilongpressgesturerecognizer *longpress = [[uilongpressgesturerecognizer alloc]

initwithtarget:self action:@selector(longpressgesturerecognized:)];

[self.tableview addgesturerecognizer:longpress];

為 gesture recognizer 新增 action 方法。該方法首先應該獲取到在 table view 中長按的位置,然後找出這個位置對應的 cell 的 index。記住:這裡獲取到的 index path 有可能為 nil(例如,如果使用者長按在 table view的section header上)。

- (ibaction)longpressgesturerecognized:(id)sender

接著你需要處理uigesturerecognizerstatebegan分支。如果獲取到乙個有效的 index path(non-nil),就去獲取對應的uitableviewcell,並利用乙個 helper 方法獲取這個 table view cell 的 snapshot view。然後將這個 snapshot view 新增到 table view 中,並將其 center 到對應的 cell上。

為了更好的使用者體驗,以及更自然的效果,在這裡我把原始 cell 的背景設定為黑色,並給 snapshot view 增加淡入效果,讓 snapshot view 比 原始 cell 稍微大一點,將它的y座標偏移量與手勢的位置的y軸對齊。這樣處理之後,cell 就像從 table view 中跳出,然後浮在上面,並捕捉到使用者的手指。

static uiview       *snapshot = nil;        ///< a snapshot of the row user is moving.

static nsindexpath *sourceindexpath = nil; ///< initial index path, where gesture begins.

switch (state) completion:nil];

}break;

} // more coming soon...

}

將下面的方法新增到 .m 檔案的尾部。該方法會根據傳入的 view,返回乙個對應的 snapshot view。

- (uiview *)customsnapshotfromview:(uiview *)inputview

當手勢移動的時候,也就是uigesturerecognizerstatechanged分支,此時需要移動 snapshot view(只需要設定它的 y 軸偏移量即可)。如果手勢移動的距離對應到另外乙個 index path,就需要告訴 table view,讓其移動 rows。同時,你需要對 data source 進行更新:

case uigesturerecognizerstatechanged: 

break;

}// more coming soon...

最後,當手勢結束或者取消時,table view 和 data source 都是最新的。你所需要做的事情就是將 snapshot view 從 table view 中移除,並把 cell 的背景色還原為白色。

為了提公升使用者體驗,我們將 snapshot view 淡出,並讓其尺寸變小至與 cell 一樣。這樣看起來就像把 cell 放回原處一樣。

default:  completion:^(bool finished) ];

sourceindexpath = nil;

break;

}

就這樣,搞定了!編譯並執行程式,現在可以通過長按手勢對 tableview cells重新排序!

如何將其利用至uicollectionview上?

假設你已經有乙個示例工程使用了uicollectionview,那麼你可以很簡單的就使用上本文之前介紹的**。所需要做的事情就是用self.collectionview替換掉self.tableview,並更新一下獲取和移動uicollectionviewcell的呼叫方法。

**:破船的部落格

長按(long Press)手勢

viewcontroller.m 長按手勢 created by rio.king on 13 11 2.import viewcontroller.h inte ce viewcontroller property nonatomic,strong uilongpressgesturerecogn...

UITableView 長按手勢

目錄 首先給 table view 新增乙個uilonggesturerecognizer。可以在 table view controller 的viewdidload方法中新增。12 3uilongpressgesturerecognizer longpress uilongpressgestur...

移動端手勢事件及長按事件模擬

h5原生事件中為移動端增加了3個觸控事件,touchstart touchmove touchend 但是我們在實際使用手機時有長按和手勢動作,但是原生並沒有給我們封裝類似的事件,所以我們需要模擬實現。function document.addeventlistener touchmove func...