具有自动布局的 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

如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?

在自动布局中动态更改 UIScrollView 的大小

UIScrollView 中宽度和高度相等的动态按钮

UIScrollView 不能使用自动布局和动态约束滚动