UITableView单元格的dynamic高度问题(Swift)

可变长度的dynamic文本被注入tableview单元格标签。 为了使tableview单元的高度dynamicresize,我已经在viewDidLoad()实现了:

 self.tableView.estimatedRowHeight = 88.0 self.tableView.rowHeight = UITableViewAutomaticDimension 

这适用于尚未滚动的单元格(因为在滚动到单元格时调用UITableViewAutomaticDimention ),但不适用于在加载数据表格时初始呈现在屏幕上的单元格。

我试图简单地重新加载数据(如许多其他资源中所build议的):

 self.tableView.reloadData() 

viewDidAppear()viewWillAppear()都是无济于事。 我迷路了..有谁知道如何让Xcode呈现最初加载在屏幕上的单元格的dynamic高度?

请让我知道,如果有更好的替代方法。

尝试这个:

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

编辑

 func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return UITableViewAutomaticDimension } 

定义以上两种方法,解决问题。

这里是例子

用这个:

 tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 300 

并且不要使用: heightForRowAtIndexPath委托函数

另外,在故事板中不要设置包含大量数据的标签的高度。 给它top, bottom, leading, trailing约束。

SWIFT 3

 tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 160 

和!!! 在storyBoard:你必须为你的标签设置TOP&BOTTOM约束。 没有其他的。

这个奇怪的错误是通过Interface Builder参数解决的,因为其他答案没有解决问题。

我所做的只是使默认的标签尺寸大于内容的可能性,并将其反映在estimatedRowHeight高度。 以前,我将界面生成器中的默认行高设置为88px并在我的控制器viewDidLoad()如此反映:

 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 88.0 

但是这没有用。 所以我意识到内容不会超过100px ,所以我设置默认的单元格高度为108px (大于潜在内容),并在控制器viewDidLoad()反映出来:

 self.tableView.rowHeight = UITableViewAutomaticDimension self.tableView.estimatedRowHeight = 108.0 

这实际上允许代码将最初的标签缩小到正确的大小。 换句话说,它从来没有扩大到一个更大的尺寸,但总是可以缩小…此外, viewWillAppear()不需要额外的self.tableView.reloadData() viewWillAppear()

我知道这不包括高度可变的内容大小,但是这在我的情况下,内容有最大可能的字符数。

不知道这是否是Swift或Interface Builder中的一个错误,但它像一个魅力。 试一试!

UITableView的dynamicresize需要2件事

  1. 在表视图单元格中设置视图的正确约束(主要包括给予您的视图适当的顶部,底部和traling约束)
  2. 在viewDidLoad()中调用TableView的这些属性

      tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 140 

这是一个关于自定义(dynamic表格视图单元格)swift写的一个奇妙的教程3。

对于Swift 3,您可以使用以下内容:

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

尝试

 override func viewWillAppear(animated: Bool) { self.tableView.layoutSubviews() } 

我有同样的问题,它适用于我。

设置行高和估计行高的自动尺寸,并确保以下步骤:

 @IBOutlet weak var table: UITableView! override func viewDidLoad() { super.viewDidLoad() 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)
  • 相对于其超级视图/单元格容器设置所有约束(顶部,底部,左侧)。
  • 可选 :即使没有数据,如果您希望标签覆盖的最小垂直面积,请设置标签的最小高度。

这是带有dynamic高度限制的示例标签。

在这里输入图像说明

我刚刚受到你的解决scheme的启发,并尝试另一种方式。

请尝试将tableView.reloadData()添加到viewDidAppear()

这对我有用。

我认为滚动背后的东西和reloadData是一样的。 当你滚动屏幕时,就像在viewDidAppear时调用reloadData()

如果这个工程,PLZ回复这个答案,所以我可以肯定这个解决scheme。

要使UITableViewCell的自动调整能够正常工作,请确保您正在进行这些更改:

  • 在Storyboard中,UITableView应该只包含dynamic原型单元格(它不应该使用静态单元格),否则自动调整function将不起作用。
  • 在故事板中,您的UITableViewCell的UILabel已经configuration了所有4个约束,即顶部,底部,引导和尾随约束。
  • 在Storyboard中,你的UITableViewCell的UILabel的行数应该是0
  • 在你的UIViewController的viewDidLoad函数下面设置UITableView属性:

     self.tableView.estimatedRowHeight = <minimum cell height> self.tableView.rowHeight = UITableViewAutomaticDimension 

我最初也得到了这个问题,我已经解决了我的问题从这个代码尝试避免使用self.tableView.reloadData()而不是此代码的dynamic高度

 [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade]; 

您应该为单元格视图/视图上的每个对象设置TOPBOTTOMHEIGHT的所有约束,如果存在,则移除存在的中间Y位置。 因为你没有这个,把文物放在另一个视图上。

设置适当的约束并更新委托方法为:

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

这将解决dynamic细胞高度问题。 如果不是,你需要检查约束。

你可以用我的下面的方法,它为我工作的dynamic高度的UITableviewCell

 func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 100.0 } 

你可以根据需要设置上述方法的返回值。