我在表格单元格中堆叠视图,其中包含三个视图。我希望隐藏一个或两个视图时堆栈视图自行调整。我的问题完全如下面的问题所述,只是我的堆栈视图在表格单元格内。这些线程中提到的解决方案对我不起作用。请参阅下面的截图,了解确切的问题
堆栈视图固定到所有侧面,分布均匀填充。
我们如何让它发挥作用?
UIStackView shift content to left when inner views are hidden
UIStackView Distribution Fill Equally
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
)中添加一些值,并且永远不会再次减去它(在您发布的代码中)。表格视图单元正在重复使用/回收。因此,当您滚动并且滚动出视图并且仅有2个已排列的子视图的旧表视图单元格正在重新生成但这次有3个排列的子视图时,它仍然具有您为stackViewTrailing
约束设置的额外常量。
尝试为约束的常量设置绝对值,而不是使用+=
运算符为其添加值,即
cell.stackViewTrailing.constant += cell.view2.frame.size.width
做这个:
cell.stackViewTrailing.constant = cell.view2.frame.size.width + padding
那应该可以解决问题。 (也就是说,如果我正确理解你的问题。)
如果堆栈视图在这里是正确的选择,您可能会重新考虑。当其中一个被隐藏(或显示)时,堆栈视图总是调整其排列的子视图的宽度,以便剩余的可见空间占用所有可用空间。如果你想拥有3个固定列,无论它们有多少是可见的,最好只使用普通约束并给所有三个子视图等宽度约束。