項目的源碼下載地址:http://download.csdn.net/detail/swingpyzf/6835365
數組
需求:xcode
一、表格裏的UILable要求自動換行
測試
二、建立的tableViewCell的高度會自動適應內容的高度atom
1、用xcode構建項目,建立一個有tableView的視圖,用純代碼的形式實現:spa
一、建立一個UIViewController類,定義一個UITableView,實現TableView的委託和數據源協議.net
[objc] view plaincopyprint?代理
// code
// TableViewController.h orm
// AdaptiveCell 對象
//
// Created by swinglife on 14-1-10.
// Copyright (c) 2014年 swinglife. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface TableViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{
}
@property (nonatomic,retain) UITableView *tableView;
二、實現UITableView對象的初始化,聲明一個tableData的數組對象用來保存tableView中得數據
[objc] view plaincopyprint?
#import "TableViewController.h"
@interface TableViewController (){
NSMutableArray *tableData; //tableView數據存放數組
}
@implementation TableViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
tableData = [[NSMutableArray alloc] init];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self initTableView];
}
//初始化tableView;
-(void)initTableView{
CGRect frame = self.view.frame;
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];
//代理類
_tableView.delegate = self;
//數據源
_tableView.dataSource = self;
[self.view addSubview:_tableView];
}
三、建立自定義的UITableViewCell類,聲明須要用到的控件對象和方法:
[objc] view plaincopyprint?
#import <UIKit/UIKit.h>
@interface TableViewCell : UITableViewCell{
}
//用戶名
@property(nonatomic,retain) UILabel *name;
//用戶介紹
@property(nonatomic,retain) UILabel *introduction;
//用戶頭像
@property(nonatomic,retain) UIImageView *userImage;
//給用戶介紹賦值而且實現自動換行
-(void)setIntroductionText:(NSString*)text;
//初始化cell類
-(id)initWithReuseIdentifier:(NSString*)reuseIdentifier;
@end
四、初始化Cell的用戶控件,實現方法:
[objc] view plaincopyprint?
//
// TableViewCell.m
// AdaptiveCell
//
// Created by swinglife on 14-1-10.
// Copyright (c) 2014年 swinglife. All rights reserved.
//
#import "TableViewCell.h"
@implementation TableViewCell
-(id)initWithReuseIdentifier:(NSString*)reuseIdentifier{
self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (self) {
[self initLayuot];
}
return self;
}
//初始化控件
-(void)initLayuot{
_name = [[UILabel alloc] initWithFrame:CGRectMake(71, 5, 250, 40)];
[self addSubview:_name];
_userImage = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 66, 66)];
[self addSubview:_userImage];
_introduction = [[UILabel alloc] initWithFrame:CGRectMake(5, 78, 250, 40)];
[self addSubview:_introduction];
}
//賦值 and 自動換行,計算出cell的高度
-(void)setIntroductionText:(NSString*)text{
//得到當前cell高度
CGRect frame = [self frame];
//文本賦值
self.introduction.text = text;
//設置label的最大行數
self.introduction.numberOfLines = 10;
CGSize size = CGSizeMake(300, 1000);
CGSize labelSize = [self.introduction.text sizeWithFont:self.introduction.font constrainedToSize:size lineBreakMode:NSLineBreakByClipping];
self.introduction.frame = CGRectMake(self.introduction.frame.origin.x, self.introduction.frame.origin.y, labelSize.width, labelSize.height);
//計算出自適應的高度
frame.size.height = labelSize.height+100;
self.frame = frame;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
}
@end
五、如今須要一個存放數據對象的模型類,建立一個UserModel用來封裝數據
[objc] view plaincopyprint?
#import <Foundation/Foundation.h>
@interface UserModel : NSObject
//用戶名
@property (nonatomic,copy) NSString *username;
//介紹
@property (nonatomic,copy) NSString *introduction;
//頭像圖片路徑
@property (nonatomic,copy) NSString *imagePath;
@end
六、如今須要一些數據,在TableViewController.m文件中實現數據的建立:
[objc] view plaincopyprint?
//我須要一點測試數據,直接複製老項目東西
-(void)createUserData{
UserModel *user = [[UserModel alloc] init];
[user setUsername:@"胖虎"];
[user setIntroduction:@"我是胖虎我怕誰!!我是胖虎我怕誰!!我是胖虎我怕誰!!"];
[user setImagePath:@"panghu.jpg"];
UserModel *user2 = [[UserModel alloc] init];
[user2 setUsername:@"多啦A夢"];
[user2 setIntroduction:@"我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!"];
[user2 setImagePath:@"duolaameng.jpg"];
UserModel *user3 = [[UserModel alloc] init];
[user3 setUsername:@"大雄"];
[user3 setIntroduction:@"我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,"];
[user3 setImagePath:@"daxiong.jpg"];
[tableData addObject:user];
[tableData addObject:user2];
[tableData addObject:user3];
}
還須要在viewDidLoad中調用上面這個方法來建立數據
[objc] view plaincopyprint?
- (void)viewDidLoad
{
[super viewDidLoad];
[self initTableView];
[self createUserData];
}
七、實現TableView的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法爲cell賦值
[objc] view plaincopyprint?
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//指定cellIdentifier爲自定義的cell
static NSString *CellIdentifier = @"Cell";
//自定義cell類
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];
}
UserModel *user = [tableData objectAtIndex:indexPath.row];
cell.name.text = user.username;
[cell.userImage setImage:[UIImage imageNamed:user.imagePath]];
[cell setIntroductionText:user.introduction];
return cell;
}
八、最後須要將cell的高度返回給
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath方法:
[objc] view plaincopyprint?
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
}
這樣TableViewController.m中得全部代碼:
[objc] view plaincopyprint?
//
// TableViewController.m
// AdaptiveCell
//
// Created by swinglife on 14-1-10.
// Copyright (c) 2014年 swinglife. All rights reserved.
//
#import "TableViewController.h"
#import "UserModel.h"
#import "TableViewCell.h"
@interface TableViewController (){
NSMutableArray *tableData; //tableView數據存放數組
}
@end
@implementation TableViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
tableData = [[NSMutableArray alloc] init];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self initTableView];
[self createUserData];
}
//初始化tableView;
-(void)initTableView{
CGRect frame = self.view.frame;
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, frame.size.height)];
//代理類
_tableView.delegate = self;
//數據源
_tableView.dataSource = self;
[self.view addSubview:_tableView];
}
//我須要一點測試數據,直接複製老項目東西
-(void)createUserData{
UserModel *user = [[UserModel alloc] init];
[user setUsername:@"胖虎"];
[user setIntroduction:@"我是胖虎我怕誰!!我是胖虎我怕誰!!我是胖虎我怕誰!!"];
[user setImagePath:@"panghu.jpg"];
UserModel *user2 = [[UserModel alloc] init];
[user2 setUsername:@"多啦A夢"];
[user2 setIntroduction:@"我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!我是多啦A夢我有肚子!!"];
[user2 setImagePath:@"duolaameng.jpg"];
UserModel *user3 = [[UserModel alloc] init];
[user3 setUsername:@"大雄"];
[user3 setIntroduction:@"我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,我是大雄我誰都怕,"];
[user3 setImagePath:@"daxiong.jpg"];
[tableData addObject:user];
[tableData addObject:user2];
[tableData addObject:user3];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
TableViewCell *cell = [self tableView:_tableView cellForRowAtIndexPath:indexPath];
return cell.frame.size.height;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//指定cellIdentifier爲自定義的cell
static NSString *CellIdentifier = @"Cell";
//自定義cell類
TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[TableViewCell alloc] initWithReuseIdentifier:CellIdentifier];
}
UserModel *user = [tableData objectAtIndex:indexPath.row];
cell.name.text = user.username;
[cell.userImage setImage:[UIImage imageNamed:user.imagePath]];
[cell setIntroductionText:user.introduction];
return cell;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
總結:這種方式是經過計算出UILabel自動換行後的高度後,經過-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 方法將高度返回給TableView而後構建cell的高度。
最後的運行效果: