Swift如何实现类Instagram的嵌套评论及回复功能
问题1解答:collectionView嵌套的自动尺寸实现
你已经用collectionView完成了评论外层UI的话,嵌套回复collectionView的方案完全可行,自适配高度按如下步骤操作即可:
- 内层回复collectionView的布局对象设置
estimatedItemSize = UICollectionViewFlowLayout.automaticSize(用FlowLayout的情况),如果用CompositionalLayout,对应组的高度设为.estimated(预估高度值比如80)即可 - 回复cell内部的控件约束要上下撑满:比如顶部头像、昵称、内容文本的底部约束要绑定cell的底部,文本控件
numberOfLines = 0,系统会自动计算cell宽度下的文本高度,算出cell的实际尺寸 - 外层评论cell里给嵌套的回复collectionView加一个高度约束,每次回复数据加载完成后调用
collectionView.reloadData(),立刻获取它的contentSize.height,更新这个高度约束的constant值,外层评论cell会自动被撑开,外层collectionView的自适配也会同步生效
问题2解答:嵌套tableView可行性&行业通用方案
嵌套tableView的实现是可行的,但在回复条数较多的场景下,嵌套tableView的复用开销会比collectionView高,滚动时容易出现掉帧。
目前行业内实现单层级评论回复(类似Instagram只有一级回复、没有多层楼中楼)的通用方案有两类:
- 扁平化列表方案:优先推荐,把主评论和回复都处理为同一列表的item,给数据加
type字段标记是主评论还是回复,回复对应的item渲染时左侧加缩进占位、隐藏回复入口即可,完全不需要嵌套,单个tableView/collectionView就可以实现,性能最好,适配成本最低 - 嵌套列表方案:外层主评论列表,每个主评论cell内部嵌套子列表放回复,适合后续要扩展多层级回复的场景,子列表优先用collectionView实现,性能优于嵌套tableView
内容的提问来源于stack exchange,提问作者Si Choi
相关产品推荐
相关产品推荐

