为什么UITableViewAutomaticDimension不工作?

您好,有很多问题回答了UITableViewCellUITableView的dynamic高度。 不过,当我做到这一点时,我感到奇怪。

这里有一些答案:

在这里和这里

通常这会回答细胞的dynamic高度

 tableView.estimatedRowHeight = 44.0 tableView.rowHeight = UITableViewAutomaticDimension 

但在我的情况下,我想知道这行不会做任何事情。

在单击splitview内的tabbar后,我的UITableView正在被查看。 这有帮助吗?

也许我错过了一些东西。 任何人都可以帮助我,我花了2个小时做傻事。

这些是我对标题的限制标题可能很长,但标签不是。

在这里输入图像说明

这是我的手机

在这里输入图像说明

为了使UITableViewAutomaticDimension工作,您必须设置所有相对于单元格容器视图的左,右,底部和顶部约束。 在你的情况下,你将需要添加缺less的底部空间超级查看标题下的标签约束

我以编程的方式添加了约束,并直接将它们直接添加到单元格中,即不在contentView属性上。 将约束添加到contentView为我解决了它!

还要确保单元格中的UILabel的行被设置为0.如果设置为1,则不会垂直增长。

我有一个具体的案例,99%的解决scheme我读不起来。 我想我会分享我的经验。 希望它可以帮助,因为在解决这个问题之前,我挣扎了几个小时。

我的场景

  • 在一个ViewController中使用两个TableViews
  • 我在这些tableviews中加载自定义单元格(xib)
  • 单元格中的dynamic内容由两个标签组成
  • 页面使用ScrollView

我需要做的是

  • dynamicTableView高度
  • dynamicTableViewCells高度

你需要检查,以使其顺利工作

  • 像每个教程和答案都会告诉你,为你的标签/内容(顶部,底部,前后)设置所有约束,并将其设置为ContentView(Superview)。 这个video教程将有所帮助 。

  • 在我的ViewController的viewWillAppear方法,我给我的tableViews( tableView2 )估计行高,然后使用UITableViewAutomaticDimension (和所有教程/答案中所示):

      override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) tableView2.estimatedRowHeight = 80 tableView2.rowHeight = UITableViewAutomaticDimension } 

对我而言,这些以前的步骤是不够的。 我的TableView将简单地采用estimatedRowHeight并乘以单元格的数量。 Meeeh。

  • 正如我使用两个不同的tableViews,我创build了他们每个, tableView1tableView2出口。 允许我在viewDidLayoutSubviews方法中调整它们的大小。 随意在评论中问我是如何做到这一点。

  • 另外一个步骤是通过将其添加到viewDidAppear方法中来解决这个问题。

     override func viewDidAppear(_ animated: Bool) { tableView1.reloadData() // reloading data for the first tableView serves another purpose, not exactly related to this question. tableView2.setNeedsLayout() tableView2.layoutIfNeeded() tableView2.reloadData() } 

希望帮助别人!

忘了删除tableView(heightForRowAt:indexPath:)

可能是这样的,就像我一样,你不小心忘了去掉 heightForRowAt方法的样板代码。

 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 60.0 } 

在我的情况下,我有两个UITableViews,我不得不修改这个方法为

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ CGFloat height = 0.0; if (tableView == self.tableviewComments) { return UITableViewAutomaticDimension; }else if (tableView == self.tableViewFriends) { height = 44.0; } return height; } 

确保以下步骤,自动尺寸有效的单元格/行高度布局。

  • 分配和实施数据源和委托
  • UITableViewAutomaticDimension分配给rowHeight&estimatedRowHeight
  • 实现委托/数据源方法(即heightForRowAt并返回一个值UITableViewAutomaticDimension它)

 @IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() // Don't forget to set dataSource and delegate for table table.dataSource = self table.delegate = self // Set automatic dimensions for row height table.rowHeight = UITableViewAutomaticDimension table.estimatedRowHeight = UITableViewAutomaticDimension } // UITableViewAutomaticDimension calculates height of label contents/text func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

对于UITableviewCell中的标签实例

  • 设置行数= 0(&line break mode = truncate tail)
  • 相对于其超级视图/单元格容器设置所有约束(顶部,底部,左侧)。
  • 可选 :即使没有数据,如果您希望标签覆盖的最小垂直面积,请设置标签的最小高度。

在这里输入图像说明

为了使UITableViewAutomaticDimension工作,你需要确保所有4个angular的约束被添加到超级视图。 在大多数情况下,它适用于UILabel,但有时我发现UITextView在UILabel在当时不能正常工作的情况下诀窍。 因此,请尝试切换到UITextView,并确保在故事板中取消选中“ Scrolling Enabled ,或者也可以以编程方式进行设置。

我有三个横向项目,最左侧左侧有一个约束,中间有一个顶部,底部,左侧项目和右侧项目。 正确的人有一个权利,并离开中间项目。 解决的办法是在中间项目(我的标签)上添加额外的左右约束,对于单元格> =某个数字。