具有自动布局的 UIScrollView 中的动态大小的 UITableView
Posted
技术标签:
【中文标题】具有自动布局的 UIScrollView 中的动态大小的 UITableView【英文标题】:Dynamically-sized UITableView in UIScrollView with Auto-Layout 【发布时间】:2014-06-17 21:00:58 【问题描述】:关于自动布局和 UIScrollViews 的问题有一百万个,但我认为这是不同的。
我有一个看起来像这样的构造:
白色背景是 UIView,它充当 UIScrollView 中的容器(获取滚动视图以构建自己的内容大小的典型设置,以便根据容器视图正确滚动)。
TableView 1 和 TableView 2 的高度需要是动态的。我不希望它们滚动,所以我需要将它们的框架高度设置为等于它们的内容高度。
我有 IBOutlets 用于每一个的高度限制,并且可以毫无问题地调整它们。
当我尝试调整容器视图的高度时会出现问题。最终,我不想弄乱它并让该视图根据其内容自动调整大小,但这似乎不起作用(如果我离开容器视图的高度,我会在 IB 中收到警告/错误关于约束)。
如果我为容器视图的高度约束创建一个出口并设置它,我会得到一个断言失败:
*** Assertion failure in -[UIView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2935.137/UIView.m:8803
我正在 viewDidLayoutSubviews 中进行约束调整,如下所示:
- (void)viewDidLayoutSubviews
self.orderItemTableViewHeightConstraint.constant = self.orderItemTableView.contentSize.height - [self tableView:self.orderItemTableView heightForHeaderInSection:0];
self.shippingOptionTableViewHeightConstraint.constant = self.shippingMethodTableView.contentSize.height;
self.scrollViewContainerViewHeightConstraint.constant = self.cardInfoLabel.$bottom + 60;
我认为问题在于设置容器视图的高度约束会导致一些递归或什么...
问题:
-
在这种情况下,有没有办法让容器视图的高度根据其内容而变化?
如果没有,我该如何以编程方式处理?我是在错误的地方改变了约束还是什么?
感谢您的任何意见!
【问题讨论】:
一个更简单的解决方案就像我放在这里的那样:***.com/a/28184351/981979 【参考方案1】:好的,好吧,这里只是shotgunning代码,但经过多次试验和错误,这似乎解决了断言失败并给出了预期的结果:
- (void)viewDidLayoutSubviews
self.orderItemTableViewHeightConstraint.constant = self.orderItemTableView.contentSize.height - [self tableView:self.orderItemTableView heightForHeaderInSection:0];
self.shippingOptionTableViewHeightConstraint.constant = self.shippingMethodTableView.contentSize.height;
[self.view layoutIfNeeded];
self.scrollViewContainerViewHeightConstraint.constant = self.cardInfoLabel.$bottom + 60;
[self.view layoutIfNeeded];
真的很想让这个更有活力,但会在比赛的这个阶段取得胜利!
希望这对其他人有所帮助。
【讨论】:
调用 [self.view layoutIfNeeded] 曾经对我有用。以上是关于具有自动布局的 UIScrollView 中的动态大小的 UITableView的主要内容,如果未能解决你的问题,请参考以下文章
使用自动布局向 UIScrollView 添加动态大小的视图(高度)
UIScrollView 动态内容中的自动布局,底部有 UIButton