【发布时间】:2019-05-14 08:13:24
【问题描述】:
所以基本上,我想在UITableViewCell 中嵌入一个UITableView。
我使用UIStackView 来使用它的AutoLayout 力量!
无论如何,“Inner UITableView” 的每一行都将包含一个固定大小的UIImageView 和一个lines = 0 的UILabel(即不固定)
UIStackView(水平)-> UIImageView + UILabel
要求:
- 由于服务器提供的随机文本,InnerTableView 的每一行/单元格的大小应该是动态的。从而使整个Inner
UITableView的高度为automaticDimension - Inner
UITableView上方UILabel的文本也是动态的。 (因此首先使用UIStackView是有意义的)
注意:Main UITableView 由多个不同类型的单元格组成(这基本上是一个 BotChatBot)
另外:estimatedHeight 可以是 40 点左右。
问题:
动态调整大小的 InnerTableView 导致其 cellForRowAt 方法不会被调用一次,因此由于 contentSize 没有变化,因此不允许 UIStackView 增加其长度。
为了解决上述问题,我尝试了:
- 将 UITableVIew 的初始高度约束设置为 10(某个随机数),
estimatedRowHight将 InnerTableView 设置为 50,从而将 UITableView 的高度设置为tableViewInsideCellHeightConstraint?.constant = tableViewInsideCell.contentSize.height,这在某种程度上给了我一些空间,但是当 一行的高度超过了 40 的估计高度
P.S layoutIfNeeded() 为 TableView、StackView 和 ParentCell 触发
我还有另一种解决上述问题的方法:
- 使用估计高度,将常量(estimatedHeight)乘以要显示的行数,即列表大小
- 将
heightConstraint更改为Inner UITableView与计算出的值, - 每次迭代时,计算 UITableView 的总“必需”高度(使用
+=visibleCells[i].frame.height)(因为每次迭代都会提供单元格的大小(内容大小) - 更新
Inner UITableView的高度约束
if heightForTableView == nil {
if indexPath.row == listDict!.count - 1 {
var heightOfTableView: CGFloat = 0.0
let cells = tableView.visibleCells
for visibleCells in cells {
heightOfTableView += visibleCells.frame.height
}
let newHeight = heightOfTableView + cell.frame.height
reloadMe(newHeight)
}
}
上述修复会导致 UI 出现明显的抖动:[
问题:
上述问题有具体的解决方案吗? 我一遍又一遍地尝试搜索它..真的找不到任何强有力的修复!
【问题讨论】:
-
所以是的,问题在于表格视图本身不应该具有动态高度。他们的内容滚动。他们应该是固定的,然后他们的孩子会根据需要成长。您能否展示您尝试实现的最终 UI 的示例(可能是模型或示例)。我有一种感觉,完全采用不同的方式可能会更容易
标签: ios swift uitableview uitableviewautomaticdimension