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件事
- 在表视图单元格中设置视图的正确约束(主要包括给予您的视图适当的顶部,底部和traling约束)
-
在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];
您应该为单元格视图/视图上的每个对象设置TOP , BOTTOM和HEIGHT的所有约束,如果存在,则移除存在的中间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 }
你可以根据需要设置上述方法的返回值。