隐藏内部视图时 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 个固定列,无论它们中有多少是可见的,最好只使用普通约束并为所有三个子视图提供相等宽度的约束。
我在包含三个视图的 table 单元格中添加了堆栈视图。当隐藏一个或两个视图时,我希望堆栈视图自行调整。除了我的堆栈视图位于 table 单元格之外,我的问题与以下问题中的描述完全相同。这些线程中提到的解决方案对我不起作用。请参阅下面的屏幕截图以了解确切的问题。
堆栈视图固定在所有边上,分布均匀填充。
我们如何让它发挥作用?
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 个固定列,无论它们中有多少是可见的,最好只使用普通约束并为所有三个子视图提供相等宽度的约束。