1自定义tableview的删除
近来有个需求,自定义tableview的滑动删除,查看了很多资料,没有找到合适的,就自己研究了下,这个方法可以根据你的需求任意的修改
2下面就说下思路
该需求是通过代理实现
在tableviewcell里面创建你需要的按钮,像下面的代码一样添加到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]; //设置containerView显示在最上层
这时你要注意,你要把你想在cell上显示的东西,创建后,是添加到self.containerView上的
下面就是添加滑动手势,添加了左右滑动手势,添加左右手势的好处是,当滑动这个时,另一个会关闭滑动
//3、给容器containerView绑定左右滑动清扫手势
UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //设置向左清扫
[self.containerView addGestureRecognizer:leftSwipe];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//设置向右清扫
[self.containerView addGestureRecognizer:rightSwipe];
以上这些是UI界面上的实现
下面说些cell里面的东西
重写cell的构建方法
.h
//静态构造方法
+(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里面实现的主要代码
下面是怎么在controller里面实现
在controller里面创建tableview,和以往是一样的,不同点是在下面的这个函数里面
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
因为在cell里面已经重写了cell的构建方法,在该函数里面调用就行
-(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;
}
然后实现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
{
//循环显示的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; //关闭其他单元格的左滑
@end
@interface ZYJ_TableViewCell : UITableViewCell
//静态构造方法
+(instancetype)cellWithTableView:(UITableView *)tableview;
@property(nonatomic,strong)ZYJ_Model *model;
-(void)showdataWith:(ZYJ_Model *)model;
- (void)closeSwipe; //关闭滑动,恢复原样(用于在滑动当前单元格时,把其他已经左滑的单元格关闭)
@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 ;//是否已经打开左滑动
@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; //设置向左清扫
[self.containerView addGestureRecognizer:leftSwipe];
UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//设置向右清扫
[self.containerView addGestureRecognizer:rightSwipe];
self.selectionStyle = UITableViewCellSelectionStyleNone; //设置单元格选中样式
[self.contentView bringSubviewToFront:self.containerView]; //设置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);
}
//设置要显示的时间
-(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; //已经打开左滑,不再执行
//开始左滑: 先调用代理关闭其他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]; //关闭左滑
}
}
-(void)closeSwipe
{
if (!self.isOpenLeft) return; //还未打开左滑,不需要执行右滑
[UIView animateWithDuration:0.5 animations:^{
self.containerView.center = CGPointMake(self.frame.size.width/2 , self.frame.size.height/2 );
}];
self.isOpenLeft = NO;
}