摘自http://www.cnblogs.com/gcb999/p/3151665.html
#import <UIKit/UIKit.h> @class User; @protocol ASIHTTPRequestDelegate; @interface ProfileHeaderView : UIView <ASIHTTPRequestDelegate> @property (nonatomic, retain) User *user; @property (nonatomic, assign) UIViewController *controller; @end #define kPadding 10 #define kIconWidth 100 #define kIconHeight 100 #define kCountButtonHeight 35 #define kCountSize 12 #define kCountButtonWidth 55 #define kNameSize 15 #define kDescSize 10 #define kBtnFriend 1 #define kBtnFollower 2 #define kGlobalBg [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1] #import "ProfileHeaderView.h" #import "User.h" #import <QuartzCore/QuartzCore.h> #import "ASIHTTPRequest.h" #import "FriendController.h" #import "FollowerController.h" @interface ProfileHeaderView() { UIImageView *_icon; UILabel *_name; UILabel *_desc; UILabel *_status; UIButton *_friends; UIButton *_followers; } @end @implementation ProfileHeaderView #pragma mark 监听按钮点击 - (void)btnClick:(UIButton *)btn { FriendshipController *vc = nil; if (btn.tag == kBtnFollower) { // 粉丝 vc = [[[FollowerController alloc] init] autorelease]; vc.title = [NSString stringWithFormat:@"%@的粉丝", self.user.screenName]; } else { // 关注 vc = [[[FriendController alloc] init] autorelease]; vc.title = [NSString stringWithFormat:@"%@的关注", self.user.screenName]; } vc.uid = self.user.uid; [self.controller.navigationController pushViewController:vc animated:YES]; } #pragma mark 返回数目按钮的文字 - (NSString *)countText:(int)count title:(NSString *)title { NSString *countTitle = nil; if (count < 10000) { countTitle = [NSString stringWithFormat:@"%i", count]; } else { CGFloat countValue = count/10000.0; countTitle = [NSString stringWithFormat:countValue>=100?@"%.0f万":@"%.1f万", countValue]; } return [NSString stringWithFormat:@"%@ %@", countTitle, title]; } #pragma mark 创建一个按钮 - (UIButton *)buttonWithSelector:(SEL)selector x:(CGFloat)x y:(CGFloat)y { UIButton *button = [[[UIButton alloc] initWithFrame:CGRectMake(x, y, kCountButtonWidth, kCountButtonHeight)] autorelease]; button.titleLabel.font = [UIFont systemFontOfSize:kCountSize]; [button addTarget:self action:selector forControlEvents:UIControlEventTouchUpInside]; button.titleLabel.numberOfLines = 0; button.titleLabel.textAlignment = NSTextAlignmentCenter; [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [button setBackgroundImage:[UIImage resizeImage:@"skin_cell_background.png"] forState:UIControlStateNormal]; [button setBackgroundImage:[UIImage resizeImage:@"skin_cell_background_highlighted.png"] forState:UIControlStateHighlighted]; [button setBackgroundImage:[UIImage resizeImage:@"skin_cell_background_highlighted.png"] forState:UIControlStateDisabled]; return button; } #pragma mark - user的setter - (void)setUser:(User *)user { if (_user != user) { [_user release]; _user = [user retain]; // 下载图片 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:user.avatarLarge]]; request.delegate = self; [request startAsynchronous]; // 设置名称 _name.text = user.screenName; // 设置简介 NSString *descText = (user.descs==nil || [@"" isEqualToString:user.descs])?@"这个人比较懒,什么也没写":[NSString stringWithFormat:@"简介: %@", user.descs]; _desc.text = descText; // 设置数目 [_friends setTitle:[self countText:user.friendsCount title:@"关注"] forState:UIControlStateNormal]; [_followers setTitle:[self countText:user.followersCount title:@"粉丝"] forState:UIControlStateNormal]; // 微博数量 _status.text = [NSString stringWithFormat:@" 共%i条微博", user.statusesCount]; } } #pragma mark - 生命周期方法 - (id)init { if (self = [super init]) { CGSize winSize = [UIScreen mainScreen].bounds.size; // 顶部 UIImageView *topView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, winSize.width, kIconHeight + 2*kPadding)] autorelease]; topView.image = [UIImage imageNamed:@"profile_cover_background.png"]; [self addSubview:topView]; // 头像 CGFloat iconX = kPadding; CGFloat iconY = kPadding; _icon = [[[UIImageView alloc] initWithFrame:CGRectMake(iconX, iconY, kIconWidth, kIconHeight)] autorelease]; _icon.image = [UIImage imageNamed:@"avatar_default_big.png"]; _icon.layer.cornerRadius = 5; _icon.layer.masksToBounds = YES; [topView addSubview:_icon]; // 昵称 CGFloat nameX = iconX + kIconWidth + kPadding; CGFloat nameY = iconY; CGFloat nameWidth = winSize.width - nameX - kPadding; CGFloat nameHeight = kNameSize; _name = [[[UILabel alloc] init] autorelease]; _name.frame = CGRectMake(nameX, nameY, nameWidth, nameHeight); _name.backgroundColor = [UIColor clearColor]; _name.font = [UIFont systemFontOfSize:kNameSize]; [topView addSubview:_name]; // 简介 CGFloat descX = nameX; CGFloat descY = nameY + nameHeight + kPadding; CGFloat descWidth = nameWidth; CGFloat descheight = kIconHeight - descY; _desc = [[[UILabel alloc] init] autorelease]; _desc.frame = CGRectMake(descX, descY, descWidth, descheight); _desc.font = [UIFont systemFontOfSize:kDescSize]; _desc.backgroundColor = [UIColor clearColor]; _desc.numberOfLines = 0; _desc.textColor = [UIColor whiteColor]; [topView addSubview:_desc]; // 数目 CGFloat countViewY = topView.frame.size.height; CGFloat countViewHeight = kCountButtonHeight + 2*kPadding; UIView *countView = [[[UIView alloc] initWithFrame:CGRectMake(0, countViewY, winSize.width, countViewHeight)] autorelease]; countView.backgroundColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1]; [self addSubview:countView]; // 关注 CGFloat friendsX = kPadding; CGFloat friendsY = kPadding; _friends = [self buttonWithSelector:@selector(btnClick:) x:friendsX y:friendsY]; _friends.tag = kBtnFriend; [countView addSubview:_friends]; // 粉丝 CGFloat followersX = friendsX + kCountButtonWidth + kPadding; CGFloat followersY = friendsY; _followers = [self buttonWithSelector:@selector(btnClick:) x:followersX y:followersY]; _followers.tag = kBtnFollower; [countView addSubview:_followers]; // 顶部的线 CGFloat bottomHeight = 2; UIView *bottom = [[[UIView alloc] initWithFrame:CGRectMake(0, countViewHeight - bottomHeight, winSize.width, bottomHeight)] autorelease]; bottom.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"profile_shadow_bottom.png"]]; [countView addSubview:bottom]; // 微博数 CGFloat statusX = 0; CGFloat statusY = countViewY + countViewHeight + 2; CGFloat statusHeight = kCountSize + kPadding; _status = [[[UILabel alloc] init] autorelease]; _status.backgroundColor = kGlobalBg; _status.frame = CGRectMake(statusX, statusY, winSize.width, statusHeight); _status.font = [UIFont systemFontOfSize:kCountSize]; [self addSubview:_status]; self.frame = CGRectMake(0, 0, winSize.width, statusY + statusHeight); } return self; } - (void)dealloc { [_user release]; [super dealloc]; } #pragma mark - ASI代理 - (void)requestFinished:(ASIHTTPRequest *)request { _icon.image = [UIImage imageWithData:[request responseData]]; } @end
#import "MyDataController.h" #import "StatusMgr.h" #import "ProfileHeaderView.h" #import "User.h" @interface MyDataController () @end @implementation MyDataController - (void)viewDidLoad { [super viewDidLoad]; ProfileHeaderView *headerView = [[[ProfileHeaderView alloc] init] autorelease]; headerView.controller = self; self.tableView.tableHeaderView = headerView; self.navigationItem.leftBarButtonItem = nil; self.navigationItem.rightBarButtonItem = nil; } - (void)queryWithMgr:(StatusMgr *)mgr sinceId:(NSString *)sinceId maxId:(NSString *)maxId count:(int)count { if (!_uid) { _uid = [WeiboAccount account].uid; } [mgr queryUserStatusesWithSinceId:sinceId maxId:maxId count:count uid:_uid]; } - (void)refreshFinish:(User *)user { ProfileHeaderView *headerView = (ProfileHeaderView *)self.tableView.tableHeaderView; headerView.user = user; } - (void)dealloc { [_uid release]; [super dealloc]; } - (void)viewDidUnload { self.uid = nil; [super viewDidUnload]; } @end
// // FriendController.m // 新浪微博 // // Created by mj on 13-4-22. // Copyright (c) 2013年 itcast. All rights reserved. // #import "FriendshipController.h" #import "FriendshipMgr.h" #import "User.h" #import "Status.h" #import "DownloadOperation.h" #import <QuartzCore/QuartzCore.h> #import "MyDataController.h" @interface FriendshipController () { // 下一页的游标 int _nextCursor; } // 所有的关注数据 @property (nonatomic, retain) NSMutableArray *data; @end @implementation FriendshipController #pragma mark 下拉刷新 - (void)refreshData { [super refreshData]; [MBProgressHUD showMessag:kLoadingMsg toView:self.view]; // 查询关注列表数据 FriendshipMgr *mgr = [FriendshipMgr mgr]; if ([self respondsToSelector:@selector(queryWithMgr:uid:count:cursor:)]) { if (!_uid) { _uid = [WeiboAccount account].uid; } [self queryWithMgr:mgr uid:_uid count:20 cursor:0]; } mgr.queryFriendsBlock = ^ (NSMutableArray *friends, int nextCursor, int totalNumber, NSString *error){ // NSLog(@"friends-%i", friends.count); [MBProgressHUD hideHUDForView:self.view animated:YES]; // 设置数据 self.data = friends; // 刷新数据 [self.tableView reloadData]; // 完成刷新数据,隐藏"下拉刷新" [self doneRefreshData]; _nextCursor = nextCursor; // self.forbidLoadMore = nextCursor == 0; }; } #pragma mark 上拉加载更多 - (void)loadMoreData { [super loadMoreData]; // 查询关注列表数据 FriendshipMgr *mgr = [FriendshipMgr mgr]; if ([self respondsToSelector:@selector(queryWithMgr:uid:count:cursor:)]) { // if (!_uid) { // _uid = [WeiboAccount account].uid; // } [self queryWithMgr:mgr uid:_uid count:20 cursor:_nextCursor]; } mgr.queryFriendsBlock = ^ (NSMutableArray *friends, int nextCursor, int totalNumber, NSString *error){ // 添加数据 [self.data addObjectsFromArray:friends]; // 刷新数据 [self.tableView reloadData]; // 完成刷新数据,隐藏"上拉加载更多" [self doneLoadMoreData]; _nextCursor = nextCursor; // nextCursor为0代表,没有下一页面 self.forbidLoadMore = nextCursor == 0; }; } #pragma mark - 生命周期方法 - (void)viewDidLoad { [super viewDidLoad]; [self refreshData]; } - (void)dealloc { [_data release]; [_uid release]; [super dealloc]; } - (void)viewDidUnload { self.data = nil; self.uid = nil; [super viewDidUnload]; } #pragma mark - 私有方法 #pragma mark 初始化Cell - (UITableViewCell *)initCell { UITableViewCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"FriendCell" owner:nil options:nil] lastObject]; // 设置cell的背景色 UIView *bg = [[[UIView alloc] init] autorelease]; bg.backgroundColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1]; cell.backgroundView = bg; // 选中的背景 UIView *selectdBg = [[[UIView alloc] init] autorelease]; selectdBg.backgroundColor = [UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1]; cell.selectedBackgroundView = selectdBg; // 设置imageview的圆角半径 UIImageView *imageView = (UIImageView *)[cell viewWithTag:10]; imageView.layer.cornerRadius = 10; imageView.layer.masksToBounds = YES; return cell; } #pragma mark 设置Cell的数据 - (void)setCell:(UITableViewCell *)cell data:(User *)user { // 设置昵称 UILabel *screenNameLabel = (UILabel *)[cell viewWithTag:20]; screenNameLabel.text = user.screenName; // 设置最近一条微博的内容 UILabel *statusLabel = (UILabel *)[cell viewWithTag:30]; statusLabel.text = user.status.text; // 获取按钮 UIButton *btn = (UIButton *)[cell viewWithTag:40]; if (user.following) { // 显示"取消关注" [btn setNormalBg:@"userinfo_relationship_unfollowbutton_background.png" andHighlighted:@"userinfo_relationship_unfollowbutton_background_highlighted.png"]; [btn setTitle:@"取消关注" forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; } else { // 显示"加关注" [btn setNormalBg:@"userinfo_relationship_followbutton_background.png" andHighlighted:@"userinfo_relationship_followbutton_background_highlighted.png"]; [btn setTitle:@"加关注" forState:UIControlStateNormal]; [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; } } #pragma mark - Table view data source #pragma mark 有多少行数据 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 根据数据多少来决定是否要显示分隔线 if (self.data.count == 0) { tableView.separatorStyle = UITableViewCellSeparatorStyleNone; } else { tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; } return self.data.count; } #pragma mark 每一行的Cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { // 初始化Cell cell = [self initCell]; } // 取出这行对应的用户数据 User *user = [self.data objectAtIndex:indexPath.row]; // 设置Cell的数据 [self setCell:cell data:user]; // 从缓存中取图片 UIImage *image = [self.imageCache objectForKey:user.profileImageUrl]; UIImageView *imageView = (UIImageView *)[cell viewWithTag:10]; if (image) { imageView.image = image; } else { // 显示默认图片 imageView.image = [UIImage imageNamed:@"avatar_default.png"]; // 下载图片 [self downloadImageWithUrl:user.profileImageUrl indexPath:indexPath]; } return cell; } #pragma mark - 代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 60; } #pragma mark 选中了某一行 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; User *user = [self.data objectAtIndex:indexPath.row]; MyDataController *mydata = [[MyDataController alloc] init]; mydata.title = user.screenName; mydata.uid = user.uid; [self.navigationController pushViewController:mydata animated:YES]; [mydata release]; } @end
// // FriendController.m // 新浪微博 // // Created by mj on 13-4-22. // Copyright (c) 2013年 itcast. All rights reserved. // #import "FriendshipController.h" #import "FriendshipMgr.h" #import "User.h" #import "Status.h" #import "DownloadOperation.h" #import <QuartzCore/QuartzCore.h> #import "MyDataController.h" @interface FriendshipController () { // 下一页的游标 int _nextCursor; } // 所有的关注数据 @property (nonatomic, retain) NSMutableArray *data; @end @implementation FriendshipController #pragma mark 下拉刷新 - (void)refreshData { [super refreshData]; [MBProgressHUD showMessag:kLoadingMsg toView:self.view]; // 查询关注列表数据 FriendshipMgr *mgr = [FriendshipMgr mgr]; if ([self respondsToSelector:@selector(queryWithMgr:uid:count:cursor:)]) { if (!_uid) { _uid = [WeiboAccount account].uid; } [self queryWithMgr:mgr uid:_uid count:20 cursor:0]; } mgr.queryFriendsBlock = ^ (NSMutableArray *friends, int nextCursor, int totalNumber, NSString *error){ // NSLog(@"friends-%i", friends.count); [MBProgressHUD hideHUDForView:self.view animated:YES]; // 设置数据 self.data = friends; // 刷新数据 [self.tableView reloadData]; // 完成刷新数据,隐藏"下拉刷新" [self doneRefreshData]; _nextCursor = nextCursor; // self.forbidLoadMore = nextCursor == 0; }; } #pragma mark 上拉加载更多 - (void)loadMoreData { [super loadMoreData]; // 查询关注列表数据 FriendshipMgr *mgr = [FriendshipMgr mgr]; if ([self respondsToSelector:@selector(queryWithMgr:uid:count:cursor:)]) { // if (!_uid) { // _uid = [WeiboAccount account].uid; // } [self queryWithMgr:mgr uid:_uid count:20 cursor:_nextCursor]; } mgr.queryFriendsBlock = ^ (NSMutableArray *friends, int nextCursor, int totalNumber, NSString *error){ // 添加数据 [self.data addObjectsFromArray:friends]; // 刷新数据 [self.tableView reloadData]; // 完成刷新数据,隐藏"上拉加载更多" [self doneLoadMoreData]; _nextCursor = nextCursor; // nextCursor为0代表,没有下一页面 self.forbidLoadMore = nextCursor == 0; }; } #pragma mark - 生命周期方法 - (void)viewDidLoad { [super viewDidLoad]; [self refreshData]; } - (void)dealloc { [_data release]; [_uid release]; [super dealloc]; } - (void)viewDidUnload { self.data = nil; self.uid = nil; [super viewDidUnload]; } #pragma mark - 私有方法 #pragma mark 初始化Cell - (UITableViewCell *)initCell { UITableViewCell *cell = [[[NSBundle mainBundle] loadNibNamed:@"FriendCell" owner:nil options:nil] lastObject];
//设置cell选中的背景色,cell必须是自定义的 // 设置cell的背景色 UIView *bg = [[[UIView alloc] init] autorelease]; bg.backgroundColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1]; cell.backgroundView = bg; // 选中的背景 UIView *selectdBg = [[[UIView alloc] init] autorelease]; selectdBg.backgroundColor = [UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1]; cell.selectedBackgroundView = selectdBg; // 设置imageview的圆角半径 UIImageView *imageView = (UIImageView *)[cell viewWithTag:10]; imageView.layer.cornerRadius = 10; imageView.layer.masksToBounds = YES; return cell; } #pragma mark 设置Cell的数据 - (void)setCell:(UITableViewCell *)cell data:(User *)user { // 设置昵称 UILabel *screenNameLabel = (UILabel *)[cell viewWithTag:20]; screenNameLabel.text = user.screenName; // 设置最近一条微博的内容 UILabel *statusLabel = (UILabel *)[cell viewWithTag:30]; statusLabel.text = user.status.text; // 获取按钮 UIButton *btn = (UIButton *)[cell viewWithTag:40]; if (user.following) { // 显示"取消关注" [btn setNormalBg:@"userinfo_relationship_unfollowbutton_background.png" andHighlighted:@"userinfo_relationship_unfollowbutton_background_highlighted.png"]; [btn setTitle:@"取消关注" forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; } else { // 显示"加关注" [btn setNormalBg:@"userinfo_relationship_followbutton_background.png" andHighlighted:@"userinfo_relationship_followbutton_background_highlighted.png"]; [btn setTitle:@"加关注" forState:UIControlStateNormal]; [btn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; } } #pragma mark - Table view data source #pragma mark 有多少行数据 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 根据数据多少来决定是否要显示分隔线 if (self.data.count == 0) { tableView.separatorStyle = UITableViewCellSeparatorStyleNone; } else { tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; } return self.data.count; } #pragma mark 每一行的Cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { // 初始化Cell cell = [self initCell]; } // 取出这行对应的用户数据 User *user = [self.data objectAtIndex:indexPath.row]; // 设置Cell的数据 [self setCell:cell data:user]; // 从缓存中取图片 UIImage *image = [self.imageCache objectForKey:user.profileImageUrl]; UIImageView *imageView = (UIImageView *)[cell viewWithTag:10]; if (image) { imageView.image = image; } else { // 显示默认图片 imageView.image = [UIImage imageNamed:@"avatar_default.png"]; // 下载图片 [self downloadImageWithUrl:user.profileImageUrl indexPath:indexPath]; } return cell; } #pragma mark - 代理方法 #pragma mark 每一行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 60; } #pragma mark 选中了某一行 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; User *user = [self.data objectAtIndex:indexPath.row]; MyDataController *mydata = [[MyDataController alloc] init]; mydata.title = user.screenName; mydata.uid = user.uid; [self.navigationController pushViewController:mydata animated:YES]; [mydata release]; } @end