ios - 大神们一般是如何封装自定义tableViewCell的?如何计算自定义cell的高度?
高洛峰
高洛峰 2017-04-17 13:20:26
[iOS讨论组]

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

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

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
PHP中文网

建议使用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;
}

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

:)

伊谢尔伦

我先来:

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

return size.height;
迷茫

抱歉不是大神。
题主的问题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性能惨不忍睹,如无必要请勿自虐=。=

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号