被你們忽略的UITableViewHeaderFooterView,cell的展開和摺疊

首先自定義一個繼承UITableViewHeaderFooterView的類:ide

由於在點擊頭部的時候要判斷它是第幾個section,在此使用協議來實現atom

.h文件:spa

@class AddStaffHeadView;.net

@protocol StaffListDisplay <NSObject>3d

- (void)headViewOpenStatusChanged:(AddStaffHeadView *)headView;//使用協議來判斷哪一個頭部,是否點擊了摺疊展開按鈕,因此最好傳參數Headvieworm

@end 繼承


@interface AddStaffHeadView : UITableViewHeaderFooterViewget

@property(nonatomic , strong) UIView *titleView;string

@property(nonatomic , strong) UILabel *deptNameLabel;it

@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];

    }


效果圖: