新浪微博中tableview中头部信息

#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
原文地址:https://www.cnblogs.com/gcb999/p/3151665.html