隐藏内部视图时 UIStackView 分布均匀填充

UIStackView Distribution Fill Equally when inner view is hidden

我在包含三个视图的 table 单元格中添加了堆栈视图。当隐藏一个或两个视图时,我希望堆栈视图自行调整。除了我的堆栈视图位于 table 单元格之外,我的问题与以下问题中的描述完全相同。这些线程中提到的解决方案对我不起作用。请参阅下面的屏幕截图以了解确切的问题。

堆栈视图固定在所有边上,分布均匀填充。

我们如何让它发挥作用?

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "tableCellID", for: indexPath) as? TableViewCell else {
        fatalError("Can't find cell")
    }

    let profile = array[indexPath.row]

    if profile.status {
        cell.view2.isHidden = false
    } else {
        cell.stackViewTrailing.constant += cell.view2.frame.size.width
        cell.view2.isHidden = true
    }

    return cell
}

你的问题是你总是添加一些值到你的尾随常数(cell.view2.frame.size.width)并且永远不会再减去它(在你发布的代码中)。 Table 视图单元格正在 重用 / 回收。因此,当您滚动并且滚动出视图并且只有 2 个排列的子视图的旧 table 视图单元格被重新使用时,但是这次有 3 个排列的子视图,它仍然具有您为 stackViewTrailing约束。

尝试为约束常量设置一个 absolute 值,而不是使用 += 运算符为其添加一个值,即代替

cell.stackViewTrailing.constant += cell.view2.frame.size.width

这样做:

cell.stackViewTrailing.constant = cell.view2.frame.size.width + padding

这应该可以解决问题。 (也就是说,如果我正确理解你的问题。)

注:

您可能会重新考虑堆栈视图是否是此处的正确选择。当隐藏(或显示)其中一个子视图时,堆栈视图总是会调整它们排列的子视图的宽度,以便剩余的可见子视图占据所有可用空间 space。如果你想拥有 3 个固定列,无论它们中有多少是可见的,最好只使用普通约束并为所有三个子视图提供相等宽度的约束。