UITableView 長按手勢

2022-09-04 01:45:09 字數 3146 閱讀 7415

目錄:

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

3uilongpressgesturerecognizer *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上)。12

3456

78910

- (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 中跳出,然後浮在上面,並捕捉到使用者的手指。12

3456

78910

1112

1314

1516

1718

1920

2122

2324

2526

2728

2930

3132

3334

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。12

3456

78910

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

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

3456

78910

1112

1314

1516

1718

1920

caseuigesturerecognizerstatechanged:

break;

}

// more coming soon...

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

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

3456

78910

1112

1314

1516

1718

1920

21default: completion:^(bool finished) ];

sourceindexpath = nil;

break;

}

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

假設你已經有乙個示例工程使用了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...

IOS開發(71)之長按手勢

1 前言 uilongpressgesturerecognizer 用來監聽並捕獲到使用者用手指長久按住螢幕的某乙個地方的手勢事件。2 例項 zyviewcontroller.m plain void viewdidload void handlelongpressgestures uilongpr...

UIButton文字對齊與手勢長按執行兩次的問題

uibutton文字對齊 呼叫按鈕中的titillabel來者是文字的對齊時無效的需要呼叫uiview中的方法,方法如下 property nonatomic uicontrolcontentverticalalignment contentverticalalignment how to posi...