实现思路:
1.获取数据源,把数据字典转模型
2.创建cell 添加自定义的创建cell的类(继承自UITableViewCell)
3.创建headerView
+ (instancetype) headerView:(UITableView *)tableView {
HMHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"qq"];
if (headerView == nil) {
//创建
headerView = [[HMHeaderView alloc] initWithReuseIdentifier:@"qq"];
}
return headerView;
}
//重写创建headerView的方法
- (instancetype) initWithReuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithReuseIdentifier:reuseIdentifier];
if (self) {
//添加子控件
UIButton *nameview=[[UIButton alloc] init];
self.nameview=nameview;
[nameview setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//内容左对齐
nameview.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;
[self.contentView addSubview:nameview];
//设置小图标
[self.nameview setImage:[UIImage imageNamed:@"buddy_header_arrow"] forState:UIControlStateNormal];
//设置按钮的背景
[self.nameview setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg"] forState:UIControlStateNormal];
[self.nameview setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg_highlighted"] forState:UIControlStateHighlighted];
//设置按钮的小图标的旋转方式--围绕图标的中心旋转
self.nameview.imageView.contentMode=UIViewContentModeCenter;
//设置按钮的图标如果超出图标的原始尺寸范围,也不会进行裁切
self.nameview.imageView.clipsToBounds=NO;
//设置按钮的内容左边内间距
nameview.contentEdgeInsets=UIEdgeInsetsMake(0, 10, 0, 0);
//绑定事件
[nameview addTarget:self action:@selector(headerViewBtnDidClick) forControlEvents:UIControlEventTouchUpInside];
UILabel *numberView=[[UILabel alloc] init];
//设置按钮的文本的左间距
nameview.titleEdgeInsets=UIEdgeInsetsMake(0, 10, 0, 0);
self.numberView=numberView;
//设置对齐
numberView.textAlignment=NSTextAlignmentRight;
[self.contentView addSubview:numberView];
}
return self;
}
//按钮被点击的时候调用这个方法进行处理
- (void)headerViewBtnDidClick
{
//1.展开或者合并
self.fg.isExpand=!self.fg.isExpand;
//调用代理方法
if ([self.delegate respondsToSelector:@selector(HeaderViewBtnDidClick:)]) {
[self.delegate HeaderViewBtnDidClick:self];
}
}
//设置子控件的frame值
- (void)layoutSubviews
{
[super layoutSubviews];
//设置按钮的Frame,它与当前headerView坐标大小一致
self.nameview.frame=self.bounds;
//设置label的frame
self.numberView.frame=CGRectMake(250, 10, 110, 20);
}
//当将一个控件添加到它的父容器的时候会调用这个方法
- (void)willMoveToSuperview:(UIView *)newSuperview
{
[super willMoveToSuperview:newSuperview];
//2.旋转小图标
if (self.fg.isExpand==YES) {
self.nameview.imageView.transform=CGAffineTransformMakeRotation(M_PI_2);
}
else
{
self.nameview.imageView.transform=CGAffineTransformMakeRotation(0);
}
}
在ViewController中需要注意的:
//为每一组的头部设置自定义view--UIView
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
HMHeaderView *headerView=[HMHeaderView headerView:tableView];
headerView.tag=section;
//指定代理
headerView.delegate=self;
//赋值
headerView.fg=self.friendGroups[section];
return headerView;
}
//实现代理方法
-(void)HeaderbtnDidClick:(XYheaderCell *)headCell{
//如果使用reloadData,数据不会新建,全部在缓存区里面拿,不会调用init方法,
// [self.tableView reloadData];
NSIndexSet *set=[NSIndexSet indexSetWithIndex:[self.arr indexOfObject:headCell.data]];
[self.tableView reloadSections:set withRowAnimation:UITableViewRowAnimationFade];
}
//为实现图文混排的效果,设置button的图片选择Image
//设置按钮的小图标的旋转方式--围绕图标的中心旋转
self.nameview.imageView.contentMode=UIViewContentModeCenter;
//设置按钮的图标如果超出图标的原始尺寸范围,也不会进行裁切
self.nameview.imageView.clipsToBounds=NO;
//设置按钮的内容左边内间距
nameview.contentEdgeInsets=UIEdgeInsetsMake(0, 10, 0, 0);
//添加点击的绑定事件
//当将一个控件添加到它的父容器的时候会调用这个方法
- (void)willMoveToSuperview:(UIView *)newSuperview
{
[super willMoveToSuperview:newSuperview];
//2.旋转小图标
if (self.fg.isExpand==YES) {
self.nameview.imageView.transform=CGAffineTransformMakeRotation(M_PI_2);
}
else
{
self.nameview.imageView.transform=CGAffineTransformMakeRotation(0);
}
}