Ios 如何在自动布局中为表视图提供灵活的高度?

Ios 如何在自动布局中为表视图提供灵活的高度?,ios,autolayout,Ios,Autolayout,我想有一个场景,上面有一个垂直堆栈视图,下面有一个表视图。现场情况如下: View Stack view Table view 我希望自动布局: 让堆栈视图消耗所需的垂直空间。这个 剩余的垂直空间将转到表视图 我使用这些布局约束: stackView.leading == superview.leading stackView.trailing == superview.trailing stackView.top == topLayoutGuide.bottom tableV

我想有一个场景,上面有一个垂直堆栈视图,下面有一个表视图。现场情况如下:

View
    Stack view
    Table view
我希望自动布局:

让堆栈视图消耗所需的垂直空间。这个 剩余的垂直空间将转到表视图

我使用这些布局约束:

stackView.leading == superview.leading
stackView.trailing == superview.trailing
stackView.top == topLayoutGuide.bottom
tableView.top == stackView.bottom
tableView.leading == superview.leading
tableView.trailing == superview.trailing
tableView.bottom == bottomLayoutGuide.top
但auto layout抱怨:

表视图:需要Y位置或高度的约束。 堆栈视图:需要Y位置或高度的约束。 为了解决这个问题,我尝试增加堆栈视图的垂直内容压缩阻力优先级:

Stack View Content Compression Resistance Priority:
    Horizontal: 750
    Vertical: 751

Table View Content Compression Resistance Priority:
    Horizontal: 750
    Vertical: 750
但是运气不好,自动布局也会出现同样的错误


我这里缺少什么?

我解决了这个问题。事实证明,我们需要在堆栈视图中放置一个具体的元素来修复它。例如:

View
    Stack view
        Label
    Table view
解决了问题,而:

View
    Stack view
        Label
        Stack view
    Table view
View
    Stack view
        Label
        Stack view
            Label
    Table view
再次打断它,而:

View
    Stack view
        Label
        Stack view
    Table view
View
    Stack view
        Label
        Stack view
            Label
    Table view
再次修复它,等等


因此,似乎由于堆栈视图没有固有大小,我们需要在堆栈视图中放置一些具有固有大小的元素,以便自动布局来推断堆栈视图的大小并明确地布局内容。

是的,您做对了。但我想指出,具有动态内容(如堆栈视图和表视图)的视图在interface builder中没有有效的内部内容大小

因此,似乎由于堆栈视图没有固有的大小,我们 需要在中的堆栈视图中放置一些具有固有大小的元素 自动布局推断堆栈视图和布局大小的顺序 内容明确无误

因此,我们不应该仅仅为了避免自动布局警告而添加一些视图,而应该使用interface builder中的内在大小占位符


自动布局是一种用于设置窗框的工具。。。您需要指定tableView或stackView的高度,以便执行此操作。根据您的限制,您有两个不确定高度的视图。这种方法是否有任何缺点,例如可能隐藏一个微妙的布局错误?是的!我们可能会使视图具有占位符的固有大小,而在运行时它可能找不到占位符。但由于我们将其标记为占位符,所以必须在运行时提供它们。在上述情况下,只有当堆栈视图在运行时没有子视图时,才会发生这种情况。但是我们添加了堆栈视图来保存视图。如果我们不在运行时提供it视图,这将是我们自己的实现问题。