自定義tableview的滑動刪除

1自定義tableview的刪除

近來有個需求,自定義tableview的滑動刪除闯传,查看了很多資料峰髓,沒有找到合適的,就自己研究了下完沪,這個方法可以根據(jù)你的需求任意的修改

2下面就說下思路

該需求是通過代理實(shí)現(xiàn)

在tableviewcell里面創(chuàng)建你需要的按鈕泡躯,像下面的代碼一樣添加到self.contentView上
[self.contentView addSubview:deleteBtn];

然后聲明一個uiview,然后把這個view添加到self.contentView上,最后把這個view放到視圖層的最上面即可

@property(nonatomic,weak)UIView *containerView;
UIView *containerView = [[UIView alloc] init];
    [self.contentView addSubview:containerView];
    self.containerView = containerView;
 [self.contentView bringSubviewToFront:self.containerView];  //設(shè)置containerView顯示在最上層

這時你要注意丽焊,你要把你想在cell上顯示的東西较剃,創(chuàng)建后,是添加到self.containerView上的

下面就是添加滑動手勢技健,添加了左右滑動手勢写穴,添加左右手勢的好處是,當(dāng)滑動這個時雌贱,另一個會關(guān)閉滑動

 //3啊送、給容器containerView綁定左右滑動清掃手勢
    UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //設(shè)置向左清掃
    [self.containerView addGestureRecognizer:leftSwipe];
    
    UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//設(shè)置向右清掃
    [self.containerView addGestureRecognizer:rightSwipe];

以上這些是UI界面上的實(shí)現(xiàn)
下面說些cell里面的東西
重寫cell的構(gòu)建方法
.h

//靜態(tài)構(gòu)造方法
+(instancetype)cellWithTableView:(UITableView *)tableview;

.m

+(instancetype)cellWithTableView:(UITableView *)tableview
{
    static NSString *reuseIdentity=@"cell";
   
   ZYJ_TableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:reuseIdentity];
    if (cell==nil) {
        cell=[[ZYJ_TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentity];
        
    }
    //cell.backgroundColor=[UIColor redColor];
    return cell;
}

然后重寫cell的類型方法

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self createUI];
        
    }
    return self;
}

以上就是在tableviewcell里面實(shí)現(xiàn)的主要代碼
下面是怎么在controller里面實(shí)現(xiàn)
在controller里面創(chuàng)建tableview,和以往是一樣的欣孤,不同點(diǎn)是在下面的這個函數(shù)里面

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

因?yàn)樵赾ell里面已經(jīng)重寫了cell的構(gòu)建方法馋没,在該函數(shù)里面調(diào)用就行


   -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ZYJ_TableViewCell *cell=[ZYJ_TableViewCell cellWithTableView:tableView];
    cell.delegate=self;//代理
    ZYJ_Model *model=self.dataArry[indexPath.row];
    NSLog(@"%@",model);
    //cell.backgroundColor=[UIColor brownColor];
    [cell showdataWith:model];
    return cell;
    
}

然后實(shí)現(xiàn)cell里面的代理方法即可

-(void)deleteCell:(ZYJ_TableViewCell *)cell
{
    NSIndexPath *path=[self.ZYJ_Tableview indexPathForCell:cell];
    [self.dataArry removeObjectAtIndex:path.row];
    [self.ZYJ_Tableview deleteRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationLeft];
    
}
-(void)closeOtherCellLeftSwipe
{
    //循環(huán)顯示的cell
    for (ZYJ_TableViewCell *item in self.ZYJ_Tableview.visibleCells) {
        [item closeSwipe];
    }
}

以上就是自定義tableview滑動刪除的主要思路和主要代碼
下面是代碼tableviewcell里面的代碼

@class ZYJ_TableViewCell;
@protocol CellButtonEventViewDelegate <NSObject>

@optional
-(void)deleteCell:(ZYJ_TableViewCell *)cell; //刪除cell
- (void)closeOtherCellLeftSwipe;  //關(guān)閉其他單元格的左滑

@end

@interface ZYJ_TableViewCell : UITableViewCell
//靜態(tài)構(gòu)造方法
+(instancetype)cellWithTableView:(UITableView *)tableview;

@property(nonatomic,strong)ZYJ_Model *model;
-(void)showdataWith:(ZYJ_Model *)model;
- (void)closeSwipe; //關(guān)閉滑動,恢復(fù)原樣(用于在滑動當(dāng)前單元格時降传,把其他已經(jīng)左滑的單元格關(guān)閉)

@property(nonatomic) BOOL isSwipMode;//是否滑動
@property (nonatomic,weak) id <CellButtonEventViewDelegate> delegate;
@end
@interface ZYJ_TableViewCell()

@property(nonatomic,weak)UIView *containerView;
@property(nonatomic,weak)UILabel *showlable;
@property(nonatomic,weak)UIButton *deleteBtn;
@property(nonatomic,weak)UIView *underView;
@property(nonatomic) BOOL isOpenLeft ;//是否已經(jīng)打開左滑動


@end
@implementation ZYJ_TableViewCell

- (void)awakeFromNib {
    // Initialization code
}
+(instancetype)cellWithTableView:(UITableView *)tableview
{
    static NSString *reuseIdentity=@"cell";
   
   ZYJ_TableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:reuseIdentity];
    if (cell==nil) {
        cell=[[ZYJ_TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentity];
        
    }
    //cell.backgroundColor=[UIColor redColor];
    return cell;
}

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self createUI];
        
    }
    return self;
}
//初始化界面
-(void)createUI
{
   UIButton *deleteBtn =[UIButton buttonWithType:UIButtonTypeCustom];
    [self.contentView addSubview:deleteBtn];
    self.deleteBtn=deleteBtn;
    self.deleteBtn.backgroundColor=[UIColor redColor];
    [self.deleteBtn setTitle:@"刪除" forState:UIControlStateNormal];
    [self.deleteBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    
    [self.deleteBtn addTarget:self action:@selector(deleteCell:) forControlEvents:UIControlEventTouchUpInside];
    
    UIView *containerView = [[UIView alloc] init];
    [self.contentView addSubview:containerView];
    self.containerView = containerView;
    self.containerView.backgroundColor=[UIColor orangeColor];
    self.containerView.backgroundColor = [UIColor whiteColor];
    
    UILabel *showLable=[[UILabel alloc]init];
    [self.containerView addSubview:showLable];
    self.showlable=showLable;
  
    self.showlable.textColor=[UIColor purpleColor];
    //self.showlable.backgroundColor=[UIColor redColor];
    UIView *underView=[[UIView alloc]init];
    [self.containerView addSubview:underView];
    self.underView=underView;
    self.underView.backgroundColor=[UIColor purpleColor];
    //3篷朵、給容器containerView綁定左右滑動清掃手勢
    UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //設(shè)置向左清掃
    [self.containerView addGestureRecognizer:leftSwipe];
    
    UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//設(shè)置向右清掃
    [self.containerView addGestureRecognizer:rightSwipe];
    self.selectionStyle = UITableViewCellSelectionStyleNone; //設(shè)置單元格選中樣式

     [self.contentView bringSubviewToFront:self.containerView];  //設(shè)置containerView顯示在最上層
    
}
//子控件的布局
-(void)layoutSubviews
{
    self.containerView.frame=self.contentView.bounds;
    self.deleteBtn.frame=CGRectMake(self.frame.size.width*0.8, 10, self.frame.size.width*0.2, 40);
    self.showlable.frame=CGRectMake(0, 0, 200, 30);
    self.underView.frame=CGRectMake(15, 59, self.frame.size.width-15, 1);
    
}
//設(shè)置要顯示的時間
-(void)showdataWith:(ZYJ_Model *)model
{
 
    _model=self.model;
    self.showlable.text=model.title;
       NSLog(@"%@",model.title);
    
}
-(void)deleteCell:(UIButton *)btn
{
    if ([self.delegate respondsToSelector:@selector(deleteCell:)]) {
        [self.delegate deleteCell:self];
        
    }
}
//滑動手勢
-(void)swipe:(UISwipeGestureRecognizer *)swipe
{
    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft){
        if (self.isOpenLeft) return; //已經(jīng)打開左滑,不再執(zhí)行
        
        //開始左滑: 先調(diào)用代理關(guān)閉其他cell的左滑
        if ([self.delegate respondsToSelector:@selector(closeOtherCellLeftSwipe)])
            [self.delegate closeOtherCellLeftSwipe];
        
        [UIView animateWithDuration:0.5 animations:^{
            swipe.view.center = CGPointMake(0, self.frame.size.height/2);
            self.containerView.frame=CGRectMake(-self.frame.size.width*0.2, 0, self.frame.size.width, 60.0f);
        }];
        self.isOpenLeft = YES;
    }
    else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
        [self closeSwipe]; //關(guān)閉左滑
    }

}
-(void)closeSwipe
{
    if (!self.isOpenLeft) return; //還未打開左滑婆排,不需要執(zhí)行右滑
    
    [UIView animateWithDuration:0.5 animations:^{
        self.containerView.center = CGPointMake(self.frame.size.width/2 , self.frame.size.height/2 );
    }];
    self.isOpenLeft = NO;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末声旺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子段只,更是在濱河造成了極大的恐慌腮猖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞枕,死亡現(xiàn)場離奇詭異澈缺,居然都是意外死亡坪创,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門姐赡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來误堡,“玉大人,你說我怎么就攤上這事雏吭∷” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵杖们,是天一觀的道長悉抵。 經(jīng)常有香客問我,道長摘完,這世上最難降的妖魔是什么姥饰? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮孝治,結(jié)果婚禮上列粪,老公的妹妹穿的比我還像新娘。我一直安慰自己谈飒,他們只是感情好岂座,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著杭措,像睡著了一般费什。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上手素,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天鸳址,我揣著相機(jī)與錄音,去河邊找鬼泉懦。 笑死稿黍,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崩哩。 我是一名探鬼主播巡球,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼琢锋!你這毒婦竟也來了辕漂?” 一聲冷哼從身側(cè)響起呢灶,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吴超,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸯乃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鲸阻,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡跋涣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鸟悴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陈辱。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖细诸,靈堂內(nèi)的尸體忽然破棺而出沛贪,到底是詐尸還是另有隱情,我是刑警寧澤震贵,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布利赋,位于F島的核電站,受9級特大地震影響猩系,放射性物質(zhì)發(fā)生泄漏媚送。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一寇甸、第九天 我趴在偏房一處隱蔽的房頂上張望塘偎。 院中可真熱鬧,春花似錦拿霉、人聲如沸吟秩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峰尝。三九已至,卻和暖如春收恢,著一層夾襖步出監(jiān)牢的瞬間武学,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工伦意, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留火窒,地道東北人。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓驮肉,卻偏偏與公主長得像熏矿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子离钝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容