添加自定义UITableView头部控件方法
1.创建一个继承UITableViewHeaderFooterView的类,拥有一个模型
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值,因为此时的头部控件没有宽高,同时我们应该将头部控件的状态覆盖掉,应为头部控件是循环利用的
- (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值改变时就会调用这个方法
- (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.在控制器中实现以下方法
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
LRHeaderFooterView *heardView = [LRHeaderFooterView heardFooterViewWithTableView:tableView];
heardView.delegate = self;
heardView.group = self.groups[section];
return heardView;
}
当我们刷新表格后会重新创建新的头部控件,那么我们需要改变头部控件需要调用一下方法
// 当一个控件已经被添加到父控件中就会调用该方法
- (void)didMoveToSuperview
{
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!