首页 > 大神们一般是如何封装自定义tableViewCell的?如何计算自定义cell的高度?

大神们一般是如何封装自定义tableViewCell的?如何计算自定义cell的高度?

在自定义高度随着数据模型动态变化的tableViewCell的时候,你们一般是如何进行封装并且计算出cell高度的呢?
我的做法是:
一个控制器VC,一个cell,一个数据模型,一个装有cell所有子控件的frame的类。在VC获取到数据模型后,通过frame类计算好cell的子控件的frame和cell高度。然后在cell中根据数据模型和frame为子控件赋值和设置frame。

不知道各位大神是怎么做的?

还有,在自定义内容动态增减的cell,比如微博cell里面的图片,有时候没有图片,有时候有一张,有时候有多张。这种情况是怎么处理的?是先新建许多imageVeiw,然后根据数据动态隐藏显示,还是根据数据再来动态创建imageVeiw?
最好有个Demo,供小弟参考一下,感激不尽


抱歉不是大神。
题主的问题1:动态cell的高度如何计算?
MexiQQ的回答是对的,但过于简略了,我用的是RZCellSizeManager,除了使用systemLayoutSizeFittingSize:外,还支持高度的缓存等vip功能。对于复杂的动态cell,性能提升比较明显。该库仅支持iOS7.x、8.x,慎入。
题主的问题2:cell中数量不确定的多张imageView该如何处理?
最近刚做过一个让我想把PM脑袋拧下来的项目,就遇到了这个问题。我个人的实践体验是,在使用autolayout的情况下,当图片数量比较多时,隐藏/显示imageView比动态增删imageView性能要好得多。假如把hidden = YES视为某个方向上的size constraint.constant = 0,则符合apple官方文档中“修改constraint要好于移除并重新添加constraint”的说明。

补充:“当图片数量比较多时”是一个很模糊的说法,具体还要看每张图片的size,总之拿一台iPhone 4跑一跑,不卡就好。
此外,iPhone 4务必升到iOS7,iOS6的autolayout性能惨不忍睹,如无必要请勿自虐=。=


我先来:

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

return size.height;

建议使用AutoLayout,不建议在不了解原理的情况下使用第三方封装。

推荐几篇使用 autoLayout 来适配 tableView 动态高度的文:

http://stackoverflow.com/questions/18746929/using-auto-layout-in-uitableview-for-dynamic-cell-layouts-variable-row-heights

http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout

高级点的例子:
https://github.com/2359media/STXDynamicTableView

使用 autoLayout 来实现 cell 的动态高度,是在

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

返回高度的时候依赖 cell 的约束来计算高度,这些约束描述了目标 cell 需要的高度。
(上面说了很多

当然你也可以选择不使用autoLayout,那么这时你的代码类似:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

  Message *msgObj = _items[(NSUInteger) indexPath.row];
  NSString *msg = msgObj.content;
  CGFloat maxWidth = CGRectGetWidth(tableView.bounds);

  CGFloat msgCellWidth = maxWidth - MessageCellAvatarPadding * 2 - AVATAR_HEIGHT - MessageCellPadding-20;
  CGFloat height = [MsgCell heightForMessage:msg constrainedToWidth:msgCellWidth];

  return height+20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  MsgCell *msgItemCell = [tableView dequeueReusableCellWithIdentifier:kMsgCellId forIndexPath:indexPath];
  Message *msg = self.items[(NSUInteger) indexPath.row];
  [msgItemCell setMessage:msg];
  return msgItemCell;
}

就是自己来计算高度,原理就是这样啦

:)

【热门文章】
【热门文章】