1.建立一个继承UITableViewHeaderFooterView的类,拥有一个模型markdown
2.重写initWithStyle:reuseIdentifier:方法
添加全部须要显示的子控件(不须要设置子控件的数据和frame, 子控件要添加到contentView中)
进行子控件一次性的属性设置(有些属性只须要设置一次, 好比字体\固定的图片)布局
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithReuseIdentifier:reuseIdentifier]) { //在这里向contentView添加控件 } return self; }
类方法实现LRHeaderFooterView的循环使用字体
+ (instancetype)heardFooterViewWithTableView:(UITableView *)tableView { NSString *ID = @"heardView"; LRHeaderFooterView *heardView = [tableView dequeueReusableCellWithIdentifier:ID]; if (heardView == nil) { heardView = [[LRHeaderFooterView alloc] initWithReuseIdentifier:ID]; } return heardView; }
4.重写模型的setter方法,用来显示数据特别注意这里不能设置内部控件的frame值,由于此时的头部控件没有宽高,同时咱们应该将头部控件的状态覆盖掉,应为头部控件是循环利用的ui
- (void)setGroup:(LRFriendGroup *)group { _group = group; [self.btnView setTitle:group.name forState:UIControlStateNormal]; self.labelView.text = [NSString stringWithFormat:@"%d/%ld",group.online,group.friends.count]; //覆盖头部控件的状态 }
5.在layoutSubviews设置内部控件的frame值
这个方法是布局内部控件 当一个控件的frame值改变时就会调用这个方法spa
- (void)layoutSubviews { #warning 必定要记得写 否则添加的button不能处理点击事件 [super layoutSubviews]; self.btnView.frame = self.bounds; // self.labelView.frame = CGFloat labelH = self.bounds.size.height; CGFloat labelW = 80; CGFloat labelY = 0; CGFloat labelX = self.bounds.size.width - labelW - 10; self.labelView.frame = CGRectMake(labelX, labelY, labelW, labelH); }
6.在控制器中实现如下方法code
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { LRHeaderFooterView *heardView = [LRHeaderFooterView heardFooterViewWithTableView:tableView]; heardView.delegate = self; heardView.group = self.groups[section]; return heardView; }
// 当一个控件已经被添加到父控件中就会调用该方法 - (void)didMoveToSuperview { }