为什么UITableViewAutomaticDimension不工作?
您好,有很多问题回答了UITableViewCell
的UITableView
的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了他们每个,
tableView1
和tableView2
出口。 允许我在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
,或者也可以以编程方式进行设置。
我有三个横向项目,最左侧左侧有一个约束,中间有一个顶部,底部,左侧项目和右侧项目。 正确的人有一个权利,并离开中间项目。 解决的办法是在中间项目(我的标签)上添加额外的左右约束,对于单元格> =某个数字。