#pragma mark - tableView代理方法 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ // 取得一个自定义的 headerView QJHeaderView * headerView = [QJHeaderView headerViewWithTableView:tableView]; // 设置数据 headerView.friendGroup = self.friendGroups[section]; // 设置代理对象 headerView.delegate = self; return headerView; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 60; }UITableViewHeaderFooterView:
》可重用,与UITableViewCell类似
UIView自带的方法
1> - (void)layoutSubviews;
* 当一个控件的frame发生改变的时候就会自动调用
* 一般在这里布局内部的子控件(设置子控件的frame)
* 一定要调用super的layoutSubviews方法
2> - (void)didMoveToSuperview;
* 当一个控件被添加到父控件中就会调用
3> - (void)willMoveToSuperview:(UIView *)newSuperview;
* 当一个控件即将被添加到父控件中会调用
UIButton:
》// * 下面两个设置使得图片转换角度时不变形headerBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
效果图:
代码MVC模式:
Model:
// // QJFriend.h // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import <Foundation/Foundation.h> @interface QJFriend : NSObject @property(nonatomic,copy)NSString * icon; @property(nonatomic,copy)NSString * intro; @property(nonatomic,copy)NSString * name; @property(nonatomic,assign,getter=isVip)BOOL vip; + (instancetype)friendWithDictionary:(NSDictionary *)dic; - (instancetype)initWithDictionary:(NSDictionary *)dic; @end
// // QJFriend.m // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import "QJFriend.h" @implementation QJFriend + (instancetype)friendWithDictionary:(NSDictionary *)dic{ return [[self alloc] initWithDictionary:dic]; } - (instancetype)initWithDictionary:(NSDictionary *)dic{ if (self = [super init]) { self.icon = dic[@"icon"]; self.name = dic[@"name"]; self.intro = dic[@"intro"]; self.vip = [dic[@"vip"] intValue]; } return self; } @end
// // QJFriendGroup.h // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import <Foundation/Foundation.h> @class QJFriend; @interface QJFriendGroup : NSObject /** 存放的是QJFrined模型 */ @property(nonatomic,strong)NSArray * friends; @property(nonatomic,copy)NSString * name; @property(nonatomic,assign)int online; @property(nonatomic,assign,getter=isGroupOpen)BOOL groupOpened; + (instancetype)friendGroupWithDictionary:(NSDictionary *)dic; - (instancetype)initWithDictionary:(NSDictionary *)dic; @end
// // QJFriendGroup.m // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import "QJFriendGroup.h" #import "QJFriend.h" @implementation QJFriendGroup + (instancetype)friendGroupWithDictionary:(NSDictionary *)dic{ return [[QJFriendGroup alloc]initWithDictionary:dic]; } - (instancetype)initWithDictionary:(NSDictionary *)dic{ if (self = [super init]) { self.name = dic[@"name"]; self.online = [dic[@"online"] intValue]; self.friends = dic[@"friends"]; self.groupOpened = NO; NSMutableArray * friends = [NSMutableArray array]; for (NSDictionary * dict in self.friends ) { QJFriend * friendData = [QJFriend friendWithDictionary:dict]; [friends addObject:friendData]; } self.friends = friends ; } return self; } @end
// // QJFriendCell.h // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import <UIKit/UIKit.h> @class QJFriend; @interface QJFriendCell : UITableViewCell @property (nonatomic , weak)QJFriend * friendData; + (instancetype)friendCellWithTableView:(UITableView *)tableView; @end
// // QJFriendCell.m // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import "QJFriendCell.h" #import "QJFriend.h" @implementation QJFriendCell + (instancetype)friendCellWithTableView:(UITableView *)tableView{ static NSString * ID = @"friendCell"; QJFriendCell * cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[self alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; } return cell; } - (void)setFriendData:(QJFriend *)friendData{ _friendData = friendData; self.imageView.image = [UIImage imageNamed:friendData.icon]; self.textLabel.text = friendData.name; self.detailTextLabel.text = friendData.intro; } @end主要:
// // QJHeaderView.h // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import <UIKit/UIKit.h> @class QJFriendGroup , QJHeaderView; @protocol QJHeaderViewDelegate <NSObject> @optional - (void)headerViewDidClicked:(QJHeaderView *)headerView; @end @interface QJHeaderView : UITableViewHeaderFooterView @property (nonatomic , weak)QJFriendGroup * friendGroup; @property (nonatomic , weak)id<QJHeaderViewDelegate> delegate; + (instancetype)headerViewWithTableView:(UITableView *)tableViw; @end
// // QJHeaderView.m // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import "QJHeaderView.h" #import "QJFriendGroup.h" @interface QJHeaderView () @property (nonatomic , weak)UIButton * headerBtn; @property (nonatomic , weak)UILabel * headerLabel; - (void)headerViewDidClicked; @end @implementation QJHeaderView /** 创建一个headerView */ + (instancetype)headerViewWithTableView:(UITableView *)tableViw{ static NSString * ID = @"headerView"; // 找可重用的headerView QJHeaderView * headerView = [tableViw dequeueReusableHeaderFooterViewWithIdentifier:ID]; if (headerView == nil) { headerView = [[QJHeaderView alloc]initWithReuseIdentifier:ID]; } // headerView.friendGroup.groupOpened = NO; return headerView ; } /** 重写初始化方法 添加控件 */ - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier{ if (self = [super initWithReuseIdentifier:reuseIdentifier]) { // 1.添加一个按妞 UIButton * headerBtn = [[UIButton alloc]init]; // 设置内边距 headerBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); headerBtn.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); // 设置背景图片 [headerBtn setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg"] forState:UIControlStateNormal]; [headerBtn setBackgroundImage:[UIImage imageNamed:@"buddy_header_bg_highlighted"] forState:UIControlStateHighlighted]; // 设置button中的Image时必须要调用方法,不能用.ImageView.image来设置 [headerBtn setImage:[UIImage imageNamed:@"buddy_header_arrow"] forState:(UIControlStateNormal)] ; // * 下面两个设置使得图片转换角度时不变形 // 当国图片超出bounds的边界时 是否需要剪掉 超出的部分 headerBtn.imageView.clipsToBounds = NO; // 设置图片内容模式居中 headerBtn.imageView.contentMode = UIViewContentModeCenter; // 设置title的字体颜色 [headerBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal ]; // 添加 headerBtn 的监听点击事件 [headerBtn addTarget:self action:@selector(headerViewDidClicked) forControlEvents:UIControlEventTouchUpInside]; // 设置 headerBtn 内容水平对齐方式 headerBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; [self.contentView addSubview:headerBtn]; self.headerBtn = headerBtn ; // 2.添加一个标签控件 UILabel * headerLabel = [[UILabel alloc]init]; headerLabel.textAlignment = NSTextAlignmentRight; headerLabel.textColor = [UIColor grayColor]; [self.contentView addSubview:headerLabel]; self.headerLabel = headerLabel ; } return self ; } /** 当 headerBtn 按妞被点击时调用 */ - (void)headerViewDidClicked{ // 状态变换 self.friendGroup.groupOpened = !self.friendGroup.groupOpened; // 图片转一个角度 if (self.friendGroup.isGroupOpen){ self.headerBtn.imageView.transform = CGAffineTransformMakeRotation(M_PI_2); } else{ self.headerBtn.imageView.transform = CGAffineTransformMakeRotation(0); } // 调用代理方法 if ([self.delegate respondsToSelector:@selector(headerViewDidClicked:)]) { [self.delegate headerViewDidClicked:self]; } } /** 当初始化headerView完时,系统自动调用该方法设置子控件的frame */ - (void)layoutSubviews{ // NSLog(@"%@ --- %@",NSStringFromCGRect(self.bounds),NSStringFromCGRect(self.frame)); #warning mark - 一定要调用,不然子控件有些功能用不了 // 注意:一定要初始化父对象 [super layoutSubviews]; // 设置contentView里的子控件位置 self.headerBtn.frame = self.bounds; CGFloat W = 100; CGFloat H = self.frame.size.height; CGFloat Y = 0; CGFloat X = self.frame.size.width - W - 10; self.headerLabel.frame = CGRectMake(X, Y, W, H); } /** 初始化headerView中的内容 */ - (void)setFriendGroup:(QJFriendGroup *)friendGroup{ _friendGroup = friendGroup ; // 设置headerBtn中的内容 [self.headerBtn setTitle:friendGroup.name forState:UIControlStateNormal]; // 设置headerLabel中的内容 self.headerLabel.text = [NSString stringWithFormat:@"%d/%lu",friendGroup.online,friendGroup.friends.count]; } @end
// // ViewController.h // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end
// // ViewController.m // 11-QQ好友列表 // // Created by 瞿杰 on 15/10/3. // Copyright © 2015年 itcast. All rights reserved. // #import "ViewController.h" #import "QJFriendGroup.h" #import "QJFriendCell.h" #import "QJHeaderView.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,QJHeaderViewDelegate> @property (weak, nonatomic) IBOutlet UITableView *tableView; @property (strong,nonatomic)NSArray * friendGroups; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView.dataSource = self ; self.tableView.delegate = self; // 设置每组每个cell的高度 self.tableView.rowHeight = 60; } - (BOOL)prefersStatusBarHidden{ return YES; } /** 初始化数据内容 */ - (NSArray *)friendGroups{ if (_friendGroups == nil) { NSArray * groups = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"friends.plist" ofType:nil] ]; NSMutableArray * friendGroups = [NSMutableArray array]; for (NSDictionary * dic in groups){ QJFriendGroup * friendGroup = [QJFriendGroup friendGroupWithDictionary:dic]; [friendGroups addObject:friendGroup]; } _friendGroups = friendGroups ; } return _friendGroups ; } #pragma mark - tableView数据源方法 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return self.friendGroups.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ QJFriendGroup * group = self.friendGroups[section]; return (group.isGroupOpen ? group.friends.count : 0 ); } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ // 创建一个Cell QJFriendCell * cell = [QJFriendCell friendCellWithTableView:tableView]; // 设置数据 QJFriendGroup * group = self.friendGroups[indexPath.section]; QJFriend * friendData = group.friends[indexPath.row]; cell.friendData = friendData ; return cell; } //- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ // QJFriendGroup * group = self.friendGroups[section]; // return group.name; //} #pragma mark - tableView代理方法 - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ // 取得一个自定义的 headerView QJHeaderView * headerView = [QJHeaderView headerViewWithTableView:tableView]; // 设置数据 headerView.friendGroup = self.friendGroups[section]; // 设置代理对象 headerView.delegate = self; return headerView; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 60; } #pragma mark - QJHeaderView代理方法 - (void)headerViewDidClicked:(QJHeaderView *)headerView{ [self.tableView reloadData]; } @end