目錄:
首先給 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
case
uigesturerecognizerstatechanged:
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...