: cell的自适应高度
=
[[[UINavigationController
alloc]initWithRootViewController:[NewsController
new]]autorelease];
#define kNewsCell @"news-cell"
#import "News.h"
@interface NewsController ()
@property(nonatomic,retain)NSMutableArray *dateSouce;
- (void)dealloc{
self.dateSouce = nil;
[super
dealloc];
}
- (void)viewDidLoad {
[super
viewDidLoad];
//配置导航条信息
[self
configureNavigationControllerBarConten];
//注册
[self.tableView registerClass:[NewsCell class] forCellReuseIdentifier:kNewsCell];
//从Plist文件中读取文件
[self
readDataFromPlist];
//从Plist文件中读取文件
- (void)readDataFromPlist{
//获取文件路径
NSString
*fielPath =
[[NSBundle mainBundle]pathForResource:@"NewsData.plist"
ofType:nil];
//从文件中读取数据,由于文件最外层是字典,所以使用字典接受读取的数据
NSDictionary
*dict =
[NSDictionary dictionaryWithContentsOfFile:fielPath];
//
NSLog(@"%@",dict); 验证
NSArray
*array =
dict[@"news"];
//
NSLog(@"%@",array);
self.dateSouce = [NSMutableArray arrayWithCapacity:0];
for (NSDictionary *d in array) {
//创建model对象
News
*news =
[[News
alloc]init];
//给news赋值
[news setValuesForKeysWithDictionary:d];
//把初始化完成的model对象放到数组中
[self.dateSouce addObject:news];
[news release];
}
//
NSLog(@"%@",self.dateSouce);
验证是否放到数组中
- (void)configureNavigationControllerBarConten{
self.navigationController.navigationBar.barTintColor
= [UIColor orangeColor];
self.navigationItem.title = @"北京新闻";
(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView
{
return
1;
}
(NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return
self.dateSouce.count;
(UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NewsCell *cell = [tableView
dequeueReusableCellWithIdentifier:kNewsCell
forIndexPath:indexPath];
[cell
setValueByNews:self.dateSouce[indexPath.row]];
//选中cell的背景颜色
cell.selectedBackgroundView
= [[UIView alloc]initWithFrame:cell.frame];
cell.selectedBackgroundView.backgroundColor
= [UIColor greenColor];
//取消边框线
[cell
setBackgroundView:[[UIView
alloc]init]];
cell.backgroundColor = [UIColor clearColor];
return
cell;
}
//返回行高
此方法要比返回cell的方法先执行,所以在没有返回cell之,就在这里确定cell的高
(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return
[NewsCell cellHeight:self.dateSouce[indexPath.row]];
News;
@interface NewsCell : UITableViewCell
//写一个方法给cell上的控件赋值
- (void)setValueByNews :
(News
*)news;
//定义一个类方法返回cell的行高
//根据传进来的数据,计算当前cell的行高
+ (CGFloat)cellHeight : (News *)news;
@property(nonatomic,retain)UILabel *titleLabel;//标题
@property(nonatomic,retain)UILabel *summaryLabel;//新闻内容
@end
@implementation NewsCell
- (void)dealloc{
self.titleLabel = nil;
self.summaryLabel = nil;
[super
dealloc];
}
- (id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self.contentView addSubview:self.titleLabel];
[self.contentView
addSubview:self.summaryLabel];
}
return
self;
}
//懒加载方法
//titleLabel 10 10 300
30
- (UILabel *)titleLabel{
if (_titleLabel == nil) {
self.titleLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 30)]autorelease];
self.titleLabel.backgroundColor = [UIColor brownColor];
}
return
[[_titleLabel retain]autorelease];
}
//summaryLabe 10 50 300
50
- (UILabel *)summaryLabel{
if (_summaryLabel == nil) {
self.summaryLabel = [[[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)]autorelease];
//
self.summaryLabel.backgroundColor = [UIColor
yellowColor];
//设置文字大小
self.summaryLabel.font = [UIFont systemFontOfSize:17.0];
//根据内容换行
self.summaryLabel.numberOfLines = 0;
}
return
[[_summaryLabel retain]autorelease];
}
+
(CGFloat)summaryLabelheight :
(NSString
*)summary{
//参数解释
1.绘制文本的限制
2.设置文本高度的标准
3.设置文字的属性(文字属性中字体的大小要和summaryLabel上设置的文字大小一致)
4.文本上下文
nil
//设置文本内容的宽高
CGSize
contextSize =
CGSizeMake(300, 0);
//设置计算时文本的一些属性,比如:字体的大小
NSDictionary
*attributes =
@{NSFontAttributeName
: [UIFont systemFontOfSize:17.0]};
CGRect
summaryRect =
[summary boundingRectWithSize:contextSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes context:nil];
return
summaryRect.size.height;
}
(CGFloat)cellHeight : (News
*)news{
//
return 不可变的高 + 可变的高
//不可变的 10 + 30 + 10 +
10
//可变的 summaryLabel
的高
//计算可变的
summary文本高度
CGFloat
summartHeight =
[self
summaryLabelheight:news.summary];
return
10 + 30 + 10 + 10 +
summartHeight;
//写一个方法给cell上的控件赋值
- (void)setValueByNews :
(News
*)news{
self.titleLabel.text = news.title;
self.summaryLabel.text = news.summary;
//赋值完成之后重新计算self.summaryLabel的大小
CGRect
summaryRect =
self.summaryLabel.frame;
//修改summaryRect的高
summaryRect.size.height = [[self class]summaryLabelheight:news.summary];
//将修改后的大小赋值给self.summaryLabel.frame
self.summaryLabel.frame =
summaryRect;
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *summary;
-(void)dealloc{
self.title = nil;
self.summary = nil;
[super
dealloc];
}
//安全机制,防止未取到key值对应的Value值造成Crash
- (void)setValue:(id)value
forUndefinedKey:(NSString *)key{
//可以什么也不写
self.window.rootViewController
=
[[[UINavigationController
alloc]initWithRootViewController:[ContactTableViewController
new]]autorelease];
"Person.h"
#import "BoyCell.h"
#import "GirlCell.h"
#define kBoyCell @"boy-cell"
#define kGirlCell @"girl-cell"
@interface
ContactTableViewController
()
@property(nonatomic,retain)NSMutableDictionary
*dataSource;//存放所有联系人
*orderedKeys;//存放排好序的key
ContactTableViewController
- (void)dealloc{
self.dataSource
=
nil;
self.orderedKeys
=
nil;
[super
dealloc];
}
- (void)viewDidLoad
{
[super
viewDidLoad];
[self
costomBar];
//读取plist文件
[self
readDataFromPlist];
//cell重用新方法的使用步骤:第一步注册cell
//第一个参数:提供cell类
//第二个参数:提供cell"重用ID"
//注册boycell
[self.tableView
registerClass:[BoyCell
class]
forCellReuseIdentifier:kBoyCell];
//注册gielcell
[self.tableView
registerClass:[GirlCell
class]
forCellReuseIdentifier:kGirlCell];
//配置cell的行高
self.tableView.rowHeight
=
80.0;
- (void)costomBar{
self.navigationController.navigationBar.barTintColor
=
[UIColor
cyanColor];
self.navigationItem.title
=
@"联系人";
//从plist文件读取数据
- (void)readDataFromPlist{
//获取文件路径
NSString
*filePath =
[[NSBundle
mainBundle]pathForResource:@"Contacts.plist"
ofType:nil];
//取出文件中的内容
NSDictionary
*dict =
[NSDictionary
dictionaryWithContentsOfFile:filePath];
//
NSLog(@"%@",dict); 验证
//初始化联系人字典
self.dataSource
=
[NSMutableDictionary
dictionaryWithCapacity:0];
for
(NSString
*key
in
dict) {
//取出字典中key值对应的数组
NSArray
*group =
dict[key];
//存放初始化的model数据模型Person对象
NSMutableArray
*mGroup =
[NSMutableArray
arrayWithCapacity:0];
for
(NSDictionary
*d
in
group) {
//使用字典初始化数据模型Person对象
Person
*p
= [[Person
alloc]init];
[p setValuesForKeysWithDictionary:d];
//将p添加到mGroup数组中
[mGroup addObject:p];
[p release];
}
//将找到的key对应分组下的联系人装到字典中
[self.dataSource
setValue:mGroup
forKey:key];
}
//
NSLog(@"%@",self.dataSource);
验证
//取出所有的key值并排序
NSArray *allkeys = [dict.allKeys
sortedArrayUsingSelector:@selector(compare:)];
//使用排好序的key值数组,初始化self.orderedkeys属性
self.orderedKeys
=
[NSMutableArray
arrayWithArray:[dict.allKeys
sortedArrayUsingSelector:@selector(compare:)]];
(NSInteger)numberOfSectionsInTableView:(UITableView
*)tableView
{
return
self.orderedKeys.count;
}
(NSInteger)tableView:(UITableView
*)tableView
numberOfRowsInSection:(NSInteger)section
{
return
[self.dataSource[self.orderedKeys[section]]
count];
(UITableViewCell
*)tableView:(UITableView
*)tableView
cellForRowAtIndexPath:(NSIndexPath
*)indexPath
{
NSString
*key =
self.orderedKeys[indexPath.section];
//根据key值获取字典中的value值
NSMutableArray
*group
= self.dataSource[key];
//根据cell的row下标获取数组中对应的元素
Person
*person =
group[indexPath.row];
//根据数据模型的model对象储存的数据判断,到底要使用哪一种cell
if
([person.gender
isEqualToString:@"男"])
{
BoyCell
*cell =
[tableView dequeueReusableCellWithIdentifier:kBoyCell
forIndexPath:indexPath];
cell.person
=
person;
return
cell;
}else{
GirlCell
*cell =
[tableView dequeueReusableCellWithIdentifier:kGirlCell
forIndexPath:indexPath];
[cell setValueByPerson:person];
return
cell;
}
- (NSString
*)tableView:(UITableView
*)tableView
titleForHeaderInSection:(NSInteger)section{
return
self.orderedKeys[section];
Person
: NSObject
@property(nonatomic,copy)NSString
*name;//姓名
@property(nonatomic,copy)NSString
*gender;//姓别
@property(nonatomic,copy)NSString
*age;//年龄
@property(nonatomic,copy)NSString
*phone;//电话号码
@property(nonatomic,copy)NSString
*imageName;//图片
(void)dealloc{
self.imageName
=
nil;
self.name
=
nil;
self.age
=
nil;
self.phone
=
nil;
self.gender
=
nil;
[super
dealloc];
}
//防止使用字典赋值的时候,没有找到相应的key值Crash
(void)setValue:(id)value
forUndefinedKey:(NSString
*)key{
"BoyCell.h"
#import "Person.h"
@interface
BoyCell
()
@property(nonatomic,retain)UIImageView
*photoView;
@property(nonatomic,retain)UILabel
*nameLabel;
@property(nonatomic,retain)UILabel
*genderLabel;
@property(nonatomic,retain)UILabel
*photoLabel;
@end
@implementation
BoyCell
-(void)dealloc{
self.nameLabel
=
nil;
self.photoLabel
=
nil;
self.genderLabel
=
nil;
self.photoView
=
nil;
self.person
=
nil;
[super
dealloc];
}
//重写person的setter方法
- (void)setPerson:(Person
*)person{
if
(_person
!=
person) {
[_person
release];
_person
=
[person retain];
}
//使用person的属性为cell上的空间赋值
self.photoView.image
=
[UIImage
imageNamed:person.imageName];
self.nameLabel.text
=
person.name;
self.genderLabel.text
=
person.gender;
self.photoLabel.text
=
person.phone;
}
//图片空间
10 10 60 60
- (UIImageView
*)photoView{
if
(_photoView
==
nil)
{
self.photoView
=
[[[UIImageView
alloc]initWithFrame:CGRectMake(10,
10,
60,
60)]autorelease];
self.photoView.backgroundColor
=
[UIColor
yellowColor];
}
return
[[_photoView
retain]autorelease];
}
//姓名 90 10 60
30
- (UILabel
*)nameLabel{
if
(_nameLabel
==
nil)
{
self.nameLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(90,
10,
60,
30)]autorelease];
self.nameLabel.backgroundColor
=
[UIColor
redColor];
}
return
[[_nameLabel
retain]autorelease];
}
//性别 170 10 60
30
- (UILabel
*)genderLabel{
if
(_genderLabel
==
nil)
{
self.genderLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(170,
10,
60,
30)]autorelease];
self.genderLabel.backgroundColor
=
[UIColor
yellowColor];
}
return
[[_genderLabel
retain]autorelease];
}
//电话 90 50 140
30
- (UILabel
*)photoLabel{
if
(_photoLabel
==
nil)
{
self.photoLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(90,
45,
140,
30)]autorelease];
self.photoLabel.backgroundColor
=
[UIColor
grayColor];
}
return
[[_photoLabel
retain]autorelease];
}
//重写cell的自定义方法
- (id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString
*)reuseIdentifier{
if
(self
=
[super
initWithStyle:style
reuseIdentifier:reuseIdentifier])
{
[self.contentView
addSubview:self.photoView];
[self.contentView
addSubview:self.nameLabel];
[self.contentView
addSubview:self.genderLabel];
[self.contentView
addSubview:self.photoLabel];
}
return
self;
(void)setValueByPerson
: (Person
*)person;
@interface
GirlCell
()
@property(nonatomic,retain)UIImageView
*photoView;
@property(nonatomic,retain)UILabel
*nameLabel;
@property(nonatomic,retain)UILabel
*genderLabel;
@property(nonatomic,retain)UILabel
*phoneLabel;
@end
(id)initWithStyle:(UITableViewCellStyle)style
reuseIdentifier:(NSString
*)reuseIdentifier{
if
(self
=
[super
initWithStyle:style
reuseIdentifier:reuseIdentifier])
{
[self.contentView
addSubview:self.photoView];
[self.contentView
addSubview:self.nameLabel];
[self.contentView
addSubview:self.genderLabel];
[self.contentView
addSubview:self.phoneLabel];
}
return
self;
}
- (void)setValueByPerson
: (Person
*)person;{
self.nameLabel.text
=
person.name;
self.phoneLabel.text
=
person.phone;
self.genderLabel.text
=
person.gender;
self.photoView.image
=
[UIImage
imageNamed:person.imageName];
}
//图片 170 10 60
60
- (UIImageView
*)photoView{
if
(_photoView
==
nil)
{
self.photoView
=
[[[UIImageView
alloc]initWithFrame:CGRectMake(170,
10,
60,
60)]autorelease];
self.photoView.backgroundColor
=
[UIColor
greenColor];
self.photoView.layer.cornerRadius
=
30.0;
self.photoView.layer.masksToBounds
=
YES;
}
return
[[_photoView
retain]autorelease];
}
//name10 10 60
30
- (UILabel
*)nameLabel{
if
(_nameLabel
==
nil)
{
self.nameLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(10,
10,
60,
30)]autorelease];
self.nameLabel.backgroundColor
=
[UIColor
yellowColor];
}
return
[[_nameLabel
retain]autorelease];
}
//姓别 90 10 60
30
- (UILabel
*)genderLabel{
if
(_genderLabel
==
nil)
{
self.genderLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(90,
10,
60,
30)]autorelease];
self.genderLabel.backgroundColor
=
[UIColor
greenColor];
}
return
[[_genderLabel
retain
]autorelease];
}
//电话10 50 140
30
- (UILabel
*)phoneLabel{
if
(_phoneLabel
==
nil)
{
self.phoneLabel
=
[[[UILabel
alloc]initWithFrame:CGRectMake(10,
45,
140,
30)]autorelease];
self.phoneLabel.backgroundColor
=
[UIColor
redColor];
}
return
[[_phoneLabel
retain
]autorelease];