標籤:
滑動刪除在當前的ios版本中已經支援了,但是遇到複雜的比如,滑動後的功能有多個,並不是刪除功能,那麼你就得自己寫,我說得沒錯吧..........
其實關於滑刪嘛,在以前的項目中也遇到過,當時ios還不支援滑刪,所以只有看自己的了,當時我是在code4app上下的案例修改的,所以此功能以前也做好過,但是可悲的是android那邊的程式員在網上下來案例後修改不出項目需求效果,固這個功能最後被項目經曆是閹割了。。。。。
歲月如梭,公司已換了多個呵呵.....
當前公司這個項目又涉及到cell滑動功能操作,雖然當前ios已內建了滑動刪除,但是他並不能完全滿足當前項目要求,所以又得看自己得了,這次我沒打算去網上下案例,因為這個項目時間並不那麼緊迫,所以就自己寫了哦。。。。。。。。。。 (下面進入主題)
今天我給大家講解的重點是我實現這個功能的思路,想讓大家理解的也是我實現的思路, 當我用這個思路實現這個功能後,再想想上次做這個功能時,從網上下那案例是多麼的不值得我留戀.....
先貼圖我公司實現的功能如下:
懂的人都知道,一看這玩意用ios內建的滑操是不行的呵呵
首先內容展示的控制項是UITableView
三個cell其實是一個cell,的三種不同狀態,如果這個你都不知道,你下面就別繼續看了...
第一個為選中狀態:就是使用者要提交的地址
第二個為為選中狀態:
第三個就是我們cell滑動後出現的效果,當這部分功能滑動出現後,我們需要隱藏掉小圓圈button
下面就是是我的所要講的重點了
cell中展示的每一個控制項,都是add 到一個scrollview中,然後將scrollview add到cell中
cell滑動展示的部分寬度,需要增加到scrollview的 contentsize中去.下面是代碼
UIScrollView *ContentView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, DEVICE_Width , 79)];
[ContentView setContentSize:CGSizeMake(DEVICE_Width+70,79 )];
[ContentView setBackgroundColor:[UIColor whiteColor]];
[ContentView setShowsHorizontalScrollIndicator:NO];
ContentView.scrollEnabled=YES;
先將scrollview的代理引入 <UIScrollViewDelegate>
然後需要實現下面的代理:
//ScrollView代理- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ _recordCurrentOffsetX=scrollView.contentOffset.x; }//拖拽開始和腿拽結束,這兩個代理都必須加上,否則無法執行enddragging- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ }- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ if (!decelerate) { NSArray *backGroundViewChilrendArray=scrollView.subviews; if (_recordCurrentOffsetX<70) { [scrollView setContentOffset:CGPointMake(0, scrollView.contentOffset.y) animated:YES]; for (int i=0;i<backGroundViewChilrendArray.count; i++) { if ([[backGroundViewChilrendArray objectAtIndex:i] isKindOfClass:[UIButton class]]) { UIButton *button=[backGroundViewChilrendArray objectAtIndex:i] ; if (button.tag==11010) { button.hidden=NO; break; } } } } else { for (int i=0;i<backGroundViewChilrendArray.count; i++) { if ([[backGroundViewChilrendArray objectAtIndex:i] isKindOfClass:[UIButton class]]) { UIButton *button=[backGroundViewChilrendArray objectAtIndex:i] ; if (button.tag==11010) { button.hidden=YES; break; } } } } } }- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ }- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSArray *backGroundViewChilrendArray=scrollView.subviews; if (_recordCurrentOffsetX<70) { [scrollView setContentOffset:CGPointMake(0, scrollView.contentOffset.y) animated:YES]; for (int i=0;i<backGroundViewChilrendArray.count; i++) { if ([[backGroundViewChilrendArray objectAtIndex:i] isKindOfClass:[UIButton class]]) { UIButton *button=[backGroundViewChilrendArray objectAtIndex:i] ; if (button.tag==11010) { button.hidden=NO; break; } } } } else { for (int i=0;i<backGroundViewChilrendArray.count; i++) { if ([[backGroundViewChilrendArray objectAtIndex:i] isKindOfClass:[UIButton class]]) { UIButton *button=[backGroundViewChilrendArray objectAtIndex:i] ; if (button.tag==11010) { button.hidden=YES; break; } } } } }
_recordCurrentOffsetX:是一個記錄位移量x座標的cgfloat變數欄位
if (_recordCurrentOffsetX<70) {}
上面這句是判斷當前scrollview位移量的 ,上面代碼中的 <70 ------ 70就是我們cell擴充出的那部分 存放滑刪功能的部分。
如果便宜兩小於70了,我們就將位移量設定為0,不展示出滑動刪除部分
最開始我用了手勢來做這個功能,cell add的是UIView,不是scrollview,然後給UIView增加相應的手勢, 邏輯相對複雜,做出來之後有一個bug,就是當我上拉下拉這個uitableview重新整理時(根本不怎麼執行,而是執行contentview上綁定的手勢),如果我將border的寬度設定為0,那麼就完全不執行了,為什麼我想我不說各位也知道。而且以前我下那案例也是用手勢寫的,那個案例雖然解決了,我用手勢的困惑,但是體驗完全不好,而且cell上add了很多層,實現代碼之多。。。。我今天講的重點就是:當項目涉及到自己寫cell的滑操功能時,可選我這思路,只需要在UITableView中add一個UIScrollView,然後將滑動多出的寬度,增加到UIScrollView的contensize中去,再調幾個代理 就完全搞定呵呵.....(此cell滑操方法我當前好像還沒見網路上有人使用過,大多是使用手勢)
objective-c自訂滑操(原創)