1.0不等高cell计算举例

不等高cell高度计算

1.首先看效果图

Mou icon

2.重难点:

对于本例来讲最重要的就是计算cell的高度,以及理解mvc的思想

3.每一个cell可以看作是一个view,cell中的数据可以封装icon、name、vip、text、picture等数据,为了得到cell的高度还要封装每一个空间的frame,因此模型数据如下

/*** 全局定义name文本大小跟文本框的大小**/
#define WHNameFont [UIFont systemFontOfSize:17]
#define WHTextFont [UIFont systemFontOfSize:14]
@interface WHStatuses : NSObject /*** 图标**/ @property (nonatomic, copy) NSString *icon; /*** 名称**/ @property (nonatomic, copy) NSString *name; /*** vip属性**/ @property (nonatomic, assign, getter=isVip)BOOL vip; /*** 文本**/ @property (nonatomic, copy) NSString *text; /*** 图片**/ @property (nonatomic, copy) NSString *picture; /*** iconFrame**/ @property (nonatomic, assign) CGRect iconFrame; /*** nameFrame**/ @property (nonatomic, assign) CGRect nameFrame; /*** vipFrame**/ @property (nonatomic, assign) CGRect vipFrame; /*** textFrame**/ @property (nonatomic, assign) CGRect textFrame; /*** pictureFrame**/ @property (nonatomic, assign) CGRect pictureFrame; /*** 返回每行的cell高度**/ @property (nonatomic, assign) CGFloat cellHeight;

4.在模型中返回得到的cellheight高度

- (CGFloat)cellHeight { if (_cellHeight == 0) { //计算icon的rect CGFloat space = 10; CGFloat iconX = space; CGFloat iconY = space; CGFloat iconWH = 30; self.iconFrame = CGRectMake(iconX, iconY, iconWH, iconWH); //计算name的rect CGFloat nameX = CGRectGetMaxX(self.iconFrame) + space; CGFloat nameY = space; NSDictionary *dict = @{NSFontAttributeName : WHNameFont}; CGSize nameSize = [self.name sizeWithAttributes:dict]; CGFloat nameW = nameSize.width; CGFloat nameH = nameSize.height; self.nameFrame = CGRectMake(nameX, nameY, nameW, nameH); //计算vip的rect if (self.isVip) { CGFloat vipX = CGRectGetMaxX(self.nameFrame) + space; CGFloat vipY = nameY + (self.iconFrame.size.height - self.nameFrame.size.height) * 0.5; CGFloat vipWH = 14; self.vipFrame = CGRectMake(vipX, vipY, vipWH, vipWH); } //计算text的rect CGFloat textX = iconX; CGFloat textY = CGRectGetMaxY(self.iconFrame) + space; CGFloat maxTextW = [UIScreen mainScreen].bounds.size.width - 2 * space; CGSize maxTextSize = CGSizeMake(maxTextW, MAXFLOAT); CGFloat textH = [self.text boundingRectWithSize:maxTextSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : WHTextFont} context:nil].size.height; self.textFrame = CGRectMake(textX, textY, maxTextW, textH); //计算picture的rect if (self.picture) { CGFloat pictureX = iconX; CGFloat pictureY = CGRectGetMaxY(self.textFrame) + space; CGFloat pictureWH = 100; self.pictureFrame = CGRectMake(pictureX, pictureY, pictureWH, pictureWH); // 当有picture的时候cell高度计算 _cellHeight = CGRectGetMaxY(self.pictureFrame) + space; } else { // 当没有picture的时候cell高度计算 _cellHeight = CGRectGetMaxY(self.textFrame) + space; } } // 返回cell的高度 return _cellHeight; }

5.view中封装的视图如下所示

@property (nonatomic, strong) WHStatuses *statuse; @property (nonatomic, weak) UIImageView *iconImageView; @property (nonatomic, weak) UILabel *nameLabel; @property (nonatomic, weak) UIImageView *vipImageView; @property (nonatomic, weak) UILabel *text_Label; @property (nonatomic, weak) UIImageView *pictureImageView;

6.在cell创建的时候就返回创建好的一些视图

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { UIImageView *iconImageView = [[UIImageView alloc] init]; [self.contentView addSubview:iconImageView]; self.iconImageView = iconImageView;

    UILabel *nameLabel = [[UILabel alloc] init];
    nameLabel.font = WHNameFont;
    [self.contentView addSubview:nameLabel];
    self.nameLabel = nameLabel;
    
    UIImageView *vipImageView = [[UIImageView alloc] init];
    vipImageView.image = [UIImage imageNamed:@"vip"];
    [self.contentView addSubview:vipImageView];
    self.vipImageView = vipImageView;
    
    UILabel *text_label = [[UILabel alloc] init];
    text_label.font = WHTextFont;
    text_label.numberOfLines = 0;
    [self.contentView addSubview:text_label];
    self.text_Label = text_label;
    
    UIImageView *pictureImageView = [[UIImageView alloc] init];
    [self.contentView addSubview:pictureImageView];
    self.pictureImageView = pictureImageView;
}
return self;

}`

7.在view中对每一个cell自动布局设置控件的位置

- (void)layoutSubviews { [super layoutSubviews]; self.iconImageView.frame = self.statuse.iconFrame; self.nameLabel.frame = self.statuse.nameFrame; self.vipImageView.frame = self.statuse.vipFrame; self.text_Label.frame = self.statuse.textFrame; self.pictureImageView.frame = self.statuse.pictureFrame; }

8.设置每一个控件的数据

- (void)setStatuse:(WHStatuses *)statuse { _statuse = statuse; self.iconImageView.image = [UIImage imageNamed:statuse.icon]; self.nameLabel.text = statuse.name;

if (statuse.isVip) {
    self.vipImageView.hidden = NO;
    self.nameLabel.textColor = [UIColor orangeColor];
}
else
{
    self.vipImageView.hidden = YES;
    self.nameLabel.textColor = [UIColor blackColor];
}
self.nameLabel.text = statuse.text;

self.text_Label.text = statuse.text;
if (statuse.picture) {
    self.pictureImageView.hidden = NO;
    self.pictureImageView.image = [UIImage imageNamed:statuse.picture];
}
else
{
    self.pictureImageView.hidden = YES;
}

9.在控制器中懒加载数据

- (NSArray *)statuses { if (_statuses == nil) { _statuses = [WHStatuses objectArrayWithFilename:@"statuses.plist"]; } return _statuses; }

10.viewdidload中实现的方法以及实现代理的方法

NSString *ID = @"statuses";
- (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass:[WHStatusesCell class] forCellReuseIdentifier:ID]; NSLog(@"%@",self.statuses); }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.statuses.count; }

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { WHStatusesCell *cell = [self.tableView dequeueReusableCellWithIdentifier:ID]; cell.statuse = self.statuses[indexPath.row]; return cell; }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { WHStatuses *statuse = self.statuses[indexPath.row]; return statuse.cellHeight; }
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }

11.本例重难点分析

主要是计算cell的高度问题,特别是在计算文本高度的时候

CGFloat textX = iconX; CGFloat textY = CGRectGetMaxY(self.iconFrame) + space; CGFloat maxTextW = [UIScreen mainScreen].bounds.size.width - 2 * space; CGSize maxTextSize = CGSizeMake(maxTextW, MAXFLOAT); CGFloat textH = [self.text boundingRectWithSize:maxTextSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : WHTextFont} context:nil].size.height; self.textFrame = CGRectMake(textX, textY, maxTextW, textH);

12.源代码见github地址:[https://github.com/kavinkily/0315-cell]

13.PS:因对Markdown语法还在入门阶段因此文章格式存在很大的问题,敬请谅解,如果有问题的可以看源代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容