iOS自帶左滑刪除燎孟,只要設(shè)置可編輯就可以了缤弦;如果想自定義刪除界面的顯示彻磁,則可以看一下這篇文章,定制你想要的左滑界面累提。
但是某天產(chǎn)品經(jīng)理說:某些安卓用戶可能不知道左滑這個(gè)操作磁浇,要加一個(gè)按鈕,也要有相同的操作无虚;崩潰中...工作還是要繼續(xù)衍锚,沒辦法要生存嘛戴质;開始擼代碼踢匣。戈抄。。
當(dāng)我們不知道怎么實(shí)現(xiàn)一個(gè)功能的時(shí)候输莺,我一般的步驟時(shí):
1:先看一下現(xiàn)有控件支不支持漾稀,能不能實(shí)現(xiàn)這個(gè)需求崭捍;
command + 鼠標(biāo) 點(diǎn)擊進(jìn)UITableViewCell的API文件中,遍歷一遍有沒有可用方法或者屬性
找到:
?- (void)setEditing:(BOOL)editing animated:(BOOL)animated;?
嘗試一下实夹,然而并沒有什么卵用粒梦;
UITableView也有這個(gè)方法,設(shè)置一下并不是我們想要的效果缴淋;
繼續(xù)找泄朴,然后,然后就沒有了钟沛。局扶。三妈。
2:百度,谷歌
網(wǎng)上都是一些自定義刪除樣式的博客說明由捎,并沒有實(shí)現(xiàn)這種需求的類似demo饿凛,博客等;(可能有心肪,我沒搜到纠吴,據(jù)說是有一個(gè)自定義cell實(shí)現(xiàn),但是我沒找到)
3:自己實(shí)現(xiàn)固该,想各種方法
3.1伐坏,自定義界面:
想著自定義一個(gè)cell握联,自己實(shí)現(xiàn)這種效果,但是自己實(shí)現(xiàn)的總感覺效果不好纯露,動(dòng)畫不流暢代芜,還要改很多代碼,想想都麻煩钞速,想著蘋果都有這種效果了看看能不能從其他方式實(shí)現(xiàn)罚随;
3.2淘菩,研究系統(tǒng)自帶的實(shí)現(xiàn)原理,調(diào)用底層方法來實(shí)現(xiàn)它:
? ? ? 回顧之前第一步調(diào)用UITableView 的- (void)setEditing:(BOOL)editing animated:(BOOL)animated;會(huì)出現(xiàn)一個(gè)紅色減號(hào)狭郑,點(diǎn)擊這個(gè)減號(hào)就會(huì)出現(xiàn)這個(gè)效果汇在;這就有兩種思路來處理:
第一種:找到觸發(fā)動(dòng)畫的方法糕殉,直接調(diào)用Runtime方法發(fā)送消息
? ? ? ?由于無法看到源碼殖告,那就想辦法看到調(diào)用方法的順序雳锋,找到方法名就好;而查找方法調(diào)用順序最好的調(diào)試方法就是打斷點(diǎn)看調(diào)用堆棧爽丹,斷點(diǎn)打在哪呢粤蝎?UITableViewCellStateMask 這個(gè)枚舉是cell編輯時(shí)所處于的狀態(tài)袋马,而UITableViewCellStateShowingDeleteConfirmationMask這個(gè)狀態(tài)就是處于顯示刪除的狀態(tài);監(jiān)測這個(gè)狀態(tài)就好谤狡,幸好系統(tǒng)給了我我們這個(gè)方法- (void)willTransitionToState:(UITableViewCellStateMask)state墓懂,重寫這個(gè)方法霉囚,并打斷點(diǎn)調(diào)試查看調(diào)用堆棧
找到能實(shí)現(xiàn)那個(gè)的那個(gè)方法盈罐,看方法名找到setShowingDeleteConfirmation: 這個(gè)方法,參數(shù)應(yīng)該是bool類型的钓葫;在按鈕的惦記方法直接調(diào)用:
?objc_msgSend(self, NSSelectorFromString(@"setShowingDeleteConfirmation:"),YES);?
調(diào)用這個(gè)必須倒入頭文件:#import<objc/message.h> 票顾,如果上述方法報(bào)錯(cuò)看這里
這樣就可以實(shí)現(xiàn)需求奠骄,但是這種方法的弊端是[tableView setEditing:NO];失效了,造成這種情況的原因是我們直接發(fā)送消息并沒有從點(diǎn)擊按鈕的執(zhí)行方法影锈,而是半路插入,解決辦法是
在調(diào)用[tableView setEditing:NO]的地方改用發(fā)消息:
objc_msgSend(self, NSSelectorFromString(@"_animateSwipeCancelation"));
自己測試了一下是沒有問題的枣抱,也沒有出現(xiàn)閃退或者其他bug靴姿;
這種方式智能在Xcode8.0才能實(shí)現(xiàn)佛吓;如果你的Xcode8.0要是支持7.0的系統(tǒng)的話垂攘,這種方式就是不行的,可能是系統(tǒng)在升級(jí)的時(shí)候某些方法優(yōu)化了
如果非要支持7.0的就比較麻煩了吱型,因?yàn)樯厦娴哪欠N方式取巧了陨仅,正好動(dòng)畫就是在那個(gè)方法中或者之后執(zhí)行的灼伤,因此可以使用;但是iOS7.0的庫中的方法就不知道在那個(gè)方法執(zhí)行了狐赡,也不知道執(zhí)行條件颖侄,所以就要尋求另外一種方式了;
第二種方法孝鹊,找到紅色按鈕展蒂,不出意外的話應(yīng)該是繼承自UIControl的玄货,然后直接響應(yīng)事件(這種操作比較保險(xiǎn),但是代碼較多夹界,改動(dòng)的也比較多)
具體步驟:
3.2.1:點(diǎn)擊button的時(shí)候設(shè)置[tableView setEditing:YES],使紅色編輯按鈕被創(chuàng)建現(xiàn)實(shí)出來鸠踪;同時(shí)記錄當(dāng)前編輯的cell
3.2.2:找到紅色編輯按鈕,直接觸發(fā)紅色按鈕的響應(yīng)事件目锭,這樣就能實(shí)現(xiàn)我們想要的效果了
3.2.3痢虹,效果出現(xiàn)之后被去,在用戶操作完成之后要確保之前設(shè)置的東西歸位
這樣就大功告成了,demo