当隐藏内部视图时,UIStackView分布填充相等

时间:2019-03-31 17:38:55

标签: ios swift uitableview uistackview

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

堆栈视图固定在所有侧面,并且分布均匀填充。

我们如何使其工作?

UIStackView shift content to left when inner views are hidden

UIStackView Distribution Fill Equally

enter image description here

Constraints Storyboard     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
}

1 个答案:

答案 0 :(得分:0)

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

尝试为约束的常量设置绝对值,而不是使用+=运算符(即代替

)向其添加值
cell.stackViewTrailing.constant += cell.view2.frame.size.width

执行此操作:

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

那应该解决问题。 (也就是说,如果我正确理解您的问题。)

注意:

您可能会在这里重新考虑堆栈视图是否是正确的选择。当堆栈视图之一被隐藏(或显示)时,堆栈视图始终会调整其排列的子视图的宽度,以使其余的可见视图占据所有可用空间。如果无论有多少可见的列都想要有3个固定的列,最好使用普通约束并将所有三个子视图的宽度约束都相等。