您的位置:首页 > 其它

CELL⾃适应⾼度

2015-08-12 18:21 399 查看
之前我们使⽤的cell⼀直都是同样的⾼度,或者某⾏固定⾼度。 实际开发中经常要让cell根据Model中⽂本的⻓短动态的更改⾼度.

为了实现这个要求, 我们需要计算⼀段⽂本在限定宽⾼内所占矩形⼤⼩. 

iOS7计算⽂本⾼度⽅法 - (CGRect)boundingRectWithSize:(CGSize)size options: (NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context

计算⽂本⾼度需要注意:
计算⽂本⾼度时所⽤的字体要和label显⽰时⽤的字体⼀致。
label的宽度要和计算时使⽤的限定宽度⼀致。
这样才能保证⽂本显⽰在label中时,label⾼度恰巧够。

tableView:heightForRowAtIndexPath:⽅法要⽐ tableView:cellForRowAtIndexPath先执⾏。 所以我们还要提前计算好每⾏cell需要多少⾼度。 

实现的效果:



代码如下: 
#import "MovieTableViewCell.h"
@implementation MovieTableViewCell
- (void)dealloc {
[_label release];
[super dealloc];
}
#pragma mark - 自定义初始化cell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {

self.label = [[UILabel alloc] initWithFrame:(CGRectMake(20, 10,[UIScreen mainScreen].bounds.size.width - 40, 60))];
self.label.backgroundColor = [UIColor colorWithWhite:0.945 alpha:1.000];
self.label.numberOfLines = 0;
self.label.font = [UIFont systemFontOfSize:18];

[self.contentView addSubview:self.label];
[self.label release];
}
return self;
}
#pragma mark - 更改label的高度
- (void)layoutSubviews {
[super layoutSubviews];
UIFont *fnt = [UIFont systemFontOfSize:18];
CGRect textSize = [self.label.text boundingRectWithSize:(CGSizeMake([UIScreen mainScreen].bounds.size.width - 40, 1000)) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName, nil] context:nil];
CGRect frame = self.label.frame;
frame.size.height = textSize.size.height;
self.label.frame = frame;
}
@end

#pragma mark - 将显示内容放入数组中
- (void)setValueForArray {
self.dataNameArr = [NSMutableArray array];
[self.dataNameArr addObject:@"北京博纳影城朝阳门旗舰店\n\n北京市朝阳区三丰北里2号悠唐生活广场B1层朝阳门钱柜对面\n\n010-59775660"];
[self.dataNameArr addObject:@"北京橙天嘉禾吉彩影城\n\n北京海淀区玉海园五里22号配套商业楼(原吉彩体育馆\n\n"];
[self.dataNameArr addObject:@"首都电影院(金融街店)\n\n金融大街18号金融街购物中心二期地下一层\n\n010-66086662"];
[self.dataNameArr addObject:@"博纳国际影城通州店\n\n北京市通州区杨庄北里天时名苑14号楼F4-01\n\n010-56351916-800"];
[self.dataNameArr addObject:@"大地数字影院-北京望京新天地\n\n北京市朝阳区望京合生麒麟社影院\n\n010-57389734"];
}

#pragma mark - 创建自定义的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *identifer = @"movieCell";
MovieTableViewCell *movieCell = [tableView dequeueReusableCellWithIdentifier:identifer];
if (movieCell == nil) {
movieCell = [[[MovieTableViewCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:identifer] autorelease];
}
movieCell.label.text = self.dataNameArr[indexPath.row];
return movieCell;
}

#pragma mark - 设置frame的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UIFont *fnt = [UIFont systemFontOfSize:18];
NSString *text = [self.dataNameArr objectAtIndex:indexPath.row];
CGRect textSize = [text boundingRectWithSize:(CGSizeMake([UIScreen mainScreen].bounds.size.width - 40, 10000)) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName, nil] context:nil];
CGFloat contentH = textSize.size.height;
// 上下多留10px
return contentH + 20;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: