新浪微博中tableview中头部信息

摘自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:@"%@\n%@", 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:@"简介:\n%@", 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
复制代码

你可能感兴趣的:(tableview)