被大家忽略的UITableViewHeaderFooterView,cell的展开和折叠

首先自定义一个继承UITableViewHeaderFooterView的类:

因为在点击头部的时候要判断它是第几个section,在此使用协议来实现

.h文件:

@class AddStaffHeadView;

@protocol StaffListDisplay <NSObject>

- (void)headViewOpenStatusChanged:(AddStaffHeadView *)headView;//使用协议来判断哪个头部,是否点击了折叠展开按钮,所以最好传参数Headview

@end


@interface AddStaffHeadView : UITableViewHeaderFooterView

@property(nonatomic , strong) UIView *titleView;

@property(nonatomic , strong) UILabel *deptNameLabel;

@property(nonatomic , strong) UIView *seperateLineView;

@property(nonatomic , strong) UIView *addView;

@property(nonatomic , strong) UIImageView *addImageView;

@property(nonatomic , strong) UILabel *addTitleLabel;

@property(nonatomic , strong) UIButton *foldBtn;

@property(nonatomic , assign) NSInteger section;

@property(nonatomic , assign) BOOL opened;

@property(nonatomic , assign) id<StaffListDisplay> displayDelegate;


@end

.m文件:

#import "AddStaffHeadView.h"


@implementation AddStaffHeadView


- (instancetype) initWithReuseIdentifier:(NSString *)reuseIdentifier

{

    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {

        [self addViews];

        [self makeViewsConstraint];

    }

    return self;

}


- (void) addViews

{

    [self addSubview:self.titleView];

    [_titleView addSubview:self.deptNameLabel];

    [self addSubview:self.seperateLineView];

    [self addSubview:self.addView];

    [_addView addSubview:self.addImageView];

    [_addView addSubview:self.addTitleLabel];

    [_titleView addSubview:self.foldBtn];

}


- (void) makeViewsConstraint

{

    

    [_addView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.and.right.equalTo(self);

        make.bottom.equalTo(self);

        make.height.equalTo(@30);

    }];

    

    [_seperateLineView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.and.right.equalTo(self);

        make.height.equalTo(@0.5);

        make.bottom.equalTo(_addView.mas_top);

    }];

    

    [_titleView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.and.right.equalTo(self);

        make.top.equalTo(self);

        make.bottom.equalTo(_seperateLineView.mas_top);

    }];

    

    [_deptNameLabel mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(@15);

        make.right.equalTo(self).offset(-150);

        make.centerY.equalTo(_titleView);

    }];

    

    [_foldBtn mas_makeConstraints:^(MASConstraintMaker *make) {

        make.right.equalTo(@(0));

        make.centerY.equalTo(_titleView);

        make.left.equalTo(_deptNameLabel.mas_right).offset(10);

        //        make.width.equalTo(@10);

    }];

    

    

    [_addImageView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(@15);

        make.centerY.equalTo(_addView);

        make.width.equalTo(@20);

        make.height.equalTo(@20);

    }];

    [_addTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(_addImageView.mas_right).offset(10);

        make.centerY.equalTo(_addView);

        make.width.equalTo(@150);

    }];

    

}


#pragma mark getter


- (UIView *) titleView

{

    if (!_titleView) {

        _titleView = [[UIView alloc] init];

        _titleView.backgroundColor = [UIColor whiteColor];

    }

    return _titleView;

}


- (UILabel *) deptNameLabel

{

    if (!_deptNameLabel) {

        _deptNameLabel = [[UILabel alloc] init];

        _deptNameLabel.font = MC_12_Font;

    }

    return _deptNameLabel;

}


- (UIView *) seperateLineView

{

    if (!_seperateLineView) {

        _seperateLineView = [[UIView alloc] init];

        _seperateLineView.backgroundColor = [UIColor lightGrayColor];

    }

    return _seperateLineView;

}


- (UIView *) addView

{

    if (!_addView) {

        _addView = [[UIView alloc] init];

        _addView.backgroundColor = [UIColor whiteColor];

    }

    return _addView;

}


- (UIImageView *) addImageView

{

    if (!_addImageView) {

        _addImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"addImage"]];

    }

    return _addImageView;

}


- (UILabel *) addTitleLabel

{

    if (!_addTitleLabel) {

        _addTitleLabel = [[UILabel alloc] init];

        _addTitleLabel.text = @"添加员工";

        _addTitleLabel.font = MC_16_Font;

        _addTitleLabel.textColor = [UIColor grayColor];

        

    }

    return _addTitleLabel;

}


- (UIButton *) foldBtn

{

    if (!_foldBtn) {

        _foldBtn = [UIButton buttonWithType:UIButtonTypeCustom];

        [_foldBtn setImage:[UIImage imageNamed:@"fold_arrow"] forState:UIControlStateNormal];

        [_foldBtn setImage:[UIImage imageNamed:@"unfold_arrow"] forState:UIControlStateSelected];

        [_foldBtn bk_addEventHandler:^(id sender) {

            if (self.opened) {

                self.opened = NO;

                

            } else {

                self.opened = YES;

            }

            if ([self.displayDelegate respondsToSelector:@selector(headViewOpenStatusChanged:)]) {

                [self.displayDelegate headViewOpenStatusChanged:self];//调用协议

            }

        } forControlEvents:UIControlEventTouchUpInside];

    }

    return _foldBtn;

}


- (void)setOpened:(BOOL)opened

{

    _opened = opened;

    self.foldBtn.selected = opened;

}



@end



在要使用的tableview写上协议:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

{


    AddStaffHeadView *deptView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"WorkHeadView"];


    QueryDeptInfoListModel *deptInfo = self.deptInfoModel.List[section];

    deptView.deptNameLabel.text = [NSString stringWithFormat:@"%@     (%@/%@)",deptInfo.DeptName,deptInfo.StaffNum,deptInfo.StaffNum];


    //添加员工加单击手势

    UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(addWorkerClicked:)];

    [deptView.addView addGestureRecognizer:tapGesture];

    tapGesture.view.tag = section;//巧妙使用手势的tag属性

    NSNumber *opened = self.openlist[section];

    deptView.opened =  opened.boolValue;

    deptView.section = section;

    deptView.displayDelegate = self;

    return deptView;

}


- (void) addWorkerClicked :(UITapGestureRecognizer *) recognizer

{

    NSInteger section = recognizer.view.tag;

    QueryDeptInfoListModel *deptInfoListModel= [QueryDeptInfoListModel mj_objectWithKeyValues:_deptInfoModel.List[section]];

    MCAddWorkerViewController *addWorkerVC = [[MCAddWorkerViewController alloc] init];

    addWorkerVC.deptId = deptInfoListModel.DeptId;

    [self.navigationController pushViewController:addWorkerVC animated:YES];

}


协议的实现:

- (void)headViewOpenStatusChanged:(AddStaffHeadView *)headView

{

    self.openlist[headView.section]=@(headView.opened);

    NSNumber *open = self.openlist[headView.section];

    if (open.boolValue == YES) {

        QueryDeptInfoListModel *deptInfoList = [QueryDeptInfoListModel mj_objectWithKeyValues:_deptInfoModel.List[headView.section]];

        [self requestNetwork:deptInfoList.DeptId section:headView.section];

    }

    else

    {

        [_tableView reloadSections:[NSIndexSet indexSetWithIndex:headView.section] withRowAnimation:UITableViewRowAnimationAutomatic];

    }


}


在最开始先默认折叠状态

_openlist = [NSMutableArray array];

    for (int i = 0; i < self.deptInfoModel.List.count; i++) {

        [_openlist addObject:@NO];

    }


效果图:

101458_BnjW_2534563.png

转载于:https://my.oschina.net/u/2534563/blog/649530

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值