UITableViewCell 左滑 多個按鈕

側滑刪除是iOS中很是容易實現的一種效果,你只須要爲你的UITableViewDataSource重寫這個方法,系統就會自動添加這種操做。git

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath


gif_01.gifgithub


從iOS8開始,蘋果開放了這樣一個API:數組

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath

返回一個UITableViewRowAction數組,每個"Action"表明一個側滑刪除的Button。這樣側滑每一行Cell能夠有更多按鈕提供給用戶交互。學習


gif_02.gifspa


不幸地是這個API只在iOS8纔有,這樣iOS8如下就沒辦法使用到這種效果。這種狀況下咱們不得不使用第三方庫或者本身重寫UITableViewCell來「模擬」出這種效果,固然有幾個庫在側滑控件上已經作得很是成熟了(這裏我就推薦一個精品:https://github.com/MortimerGoro/MGSwipeTableCell 支持多種側滑模式,算得上是側滑控件裏的瑪莎拉蒂)。code


可是,若是你跟我同樣,更喜歡蘋果的原生效果,又想在iOS8系統如下使用,那麼你也許能夠試下這個庫 JZTableViewRowActionhttps://github.com/JazysYu/JZTableViewRowAction
只要拖兩個.m文件到工程裏,你的iOS8如下設備也就會自動集成這種效果了。orm


雖然我仍是建議你至少要下載使用一次並閱讀一下個人源碼,不過你仍然能夠在沒有任何準備的狀況下來看下面的講解(下面的內容只圍繞iOS8系統版本如下):繼承

個人作法是,在側滑出來的View(那個紅色的"Delete" button),上面增長若干個咱們想要的Button,因此須要找到一個合適的時機去作這個事情,咱們知道,UITableViewCell有一個接口

- (void)willTransitionToState:(UITableViewCellStateMask)state

方法,當用戶在某一行剛開始進行側滑而且側滑的Button尚未展示出來時,state的值就爲 UITableViewCellStateShowingDeleteConfirmationMask,這個時機就再合適不過,可是,因爲Cell的側滑View是懶加載,因此這時它尚未被建立出來,但要等到與之對應的方法圖片

- (void)didTransitionToState:(UITableViewCellStateMask)state

調用的話,卻又已經展示給用戶了,爲時已晚,能想到的最好、最穩定的時機就是隻要一過 willTransitionToState:這個方法,就開始「改造」這個View,因此最好的辦法就是延時,只要這個方法一過,側滑的View就會被建立了,以後咱們能夠經過遍歷UICollectionViewCell的Subviews找到這個View,咱們在這裏模擬UITableView調用一次UITableViewDataSource的這個方法來獲取外部建立的UITableViewRowAction數組:

- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath


pic_01.png

根據數組裏的每個"rowAction"在這個View上面增長對應個數的UIButton就能夠了。

可是這樣返回的數組會永遠是空,沒錯,由於UITableViewRowAction這個類在iOS8如下根本不存在,因此咱們須要本身建立一個叫作UITableViewRowAction的類,再把它看成普通NSObject幫咱們儲存一些信息就行了,因而,在閱讀@我就叫Sunny怎麼了FDStuckView源碼後給我帶來了許多靈感,按照他的思路,咱們新建一個與UITableViewRowAction接口如出一轍的類JZTableViewRowAction,在程序運行時建立一個叫UITableViewRowAction的類做爲JZTableViewRowAction的子類,最後把它註冊到運行時中去,這樣咱們就擁有了一個「很像」UITableViewRowAction類。


pic_03.png


pic_02.png

這裏可能有些朋友會有疑問,爲何要建立一個JZTableViewRowAction而且根本沒有用到?這個問題能夠這樣回答你:若是你不建立它的話,你就須要寫更多的運行時代碼來爲你新建立的UITableViewRowAction增長方法、屬性等等,因此,相比於這個狀況,我更喜歡利用繼承的特性來作。這樣就實現了咱們想要的效果:


gif_03.gif

最後JZTableViewRowAction同時也支持給側滑控件的按鈕設置圖片,設置enable狀態,除非必要,將來也許會增長更多可自定義接口,歡迎學習或使用https://github.com/JazysYu/JZTableViewRowAction

我更喜歡寫一些拋磚引玉的文章分享給你們,但願能給你們帶來些許靈感,也歡迎微博@J_雨 一塊兒探討。One should coding to live,not live to coding :-).

相關文章
相關標籤/搜索