【问题标题】:UITableView inside UITableViewCell height issuesUITableView 里面的 UITableViewCell 高度问题
【发布时间】:2019-05-14 08:13:24
【问题描述】:

所以基本上,我想在UITableViewCell 中嵌入一个UITableView

我使用UIStackView 来使用它的AutoLayout 力量!

无论如何,“Inner UITableView” 的每一行都将包含一个固定大小的UIImageView 和一个lines = 0UILabel(即不固定)

UIStackView(水平)-> UIImageView + UILabel

要求:

  • 由于服务器提供的随机文本,InnerTableView 的每一行/单元格的大小应该是动态的。从而使整个InnerUITableView的高度为automaticDimension
  • InnerUITableView 上方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()TableViewStackViewParentCell 触发

我还有另一种解决上述问题的方法:

  1. 使用估计高度,将常量(estimatedHeight)乘以要显示的行数,即列表大小
  2. heightConstraint 更改为Inner UITableView 与计算出的值,
  3. 每次迭代时,计算 UITableView 的总“必需”高度(使用 +=visibleCells[i].frame.height)(因为每次迭代都会提供单元格的大小(内容大小)
  4. 更新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


【解决方案1】:

当您调用 api 获取 subTableView 中的数据时,您可以尝试如下:

self.tvCell?.table.reloadData() //tv cell is my Parent TableViewCell
self.table.beginUpdates() //Parent TableView
self.table.endUpdates() // Parent TableView

对我来说很好,希望对你有帮助。

【讨论】:

  • 数据是从套接字接收的,因此是一个异步进程,我不知道这个动作......另外,我无法重新加载我的父 tableView 单元格,因为它已经是一个聊天机器人包含多个单元格的列表。不过谢谢:)
  • 更新 parentTableView 可能会将用户滚动到屏幕底部.. 对吗?
  • 不,您可以看到 stackoverflow.com/questions/28244475/… 问题它可以帮助您获得动态高度而无需滚动
【解决方案2】:

好的,您正在构建一个聊天应用程序。这改变了我的一些建议。

因此,要直接回答您的问题,您可以按照以下方式进行操作:Replacement for deprecated sizeWithFont: in iOS 7? 使用 sizeWithAttributes: 计算文本的大小。将所有标签高度相加(计算图像是否会更大)并使用它来尝试计算 tableview 的固定高度,然后它将完全显示列表。这对于 tableview 来说并不是一个理想的情况。

我个人会看看 slack 处理这个问题的方式。您可以让每个选项在消息之后单独显示为一个新的气泡或单元格,或者在一个单元格中包含一堆按钮,而不是将选项放在文本气泡中。

这是一个standbot(来自他们的网站)的示例,它显示了一个带有一组按钮的单元格,可能在堆栈视图或滚动视图中。这可能是实现它的一种更简单的方法,而不是在 tableview 中使用 tableview

【讨论】:

  • 是的,是的,我完全同意你的解决方案,我有同样的想法(计算高度)但是如果用户滚动应用程序肯定会影响性能(我可以缓存它,甚至存储虽然它在模型中)。我完全同意您的 UI 建议,但我只是一名开发人员,无法真正更改利益相关者批准的设计。
  • 好吧,假设我将使用如图所示的按钮,我的CollectionView 将如何增长?我想我会遇到同样的问题。我的意思是,问题将保持不变。我真的无法为按钮提供固定大小!
  • @Dennis 我不确定stackviews 是否可行,但我知道collectionviews 有额外的功能可以帮助解决这个问题。下面是一个示例第三方控件,看起来正是这样做的:github.com/zekunyan/TTGTagCollectionView
猜你喜欢
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多