我正在寻找一种方法来调整具有更复杂布局的 tableView
单元格的大小。
为了简化问题的描述,tableview
单元由三个 View 组成。一个定义单元格“背景”的 View 和两个附加 View (每个 View 的高度均为背景单元格的 45%)。
这些附加 View 之一被标记到背景 View 的顶部,另一个被标记到底部。
如果用户点击表格 View 单元格,它应该以只有顶 View 可见的方式缩小,并且在用户再次点击之后,它应该再次调整到其完整大小。
用户点击由函数处理
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
调整大小是通过
完成的func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
不幸的是,缩小表格 View 单元格后,两个附加 View 都以原始高度的一半显示。
var selectedCell = -1
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
tableView.deselectRow(at: indexPath, animated: true)
if (selectedCell != indexPath.row)
{
selectedCell = indexPath.row
}
else {
selectedCell = -1
}
tableView.beginUpdates()
tableView.endUpdates()
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if (indexPath.row == selectedCell)
{
return 65
}
else {
return UITableView.automaticDimension
}
}
我现在正在寻找一种方法来更改代码,在缩小后只有上面的 View 可见。 Example picture of the fully visible cell 在示例图片中,缩小表格 View 单元格后应该只显示红色 View 。
提前致谢 帕特里克
最佳答案
原因是,当单元格缩小时,您的 View (因为它们的大小是相对于父级的大小定义的)也会缩小并且以一半大小可见。它们并没有真正消失/隐藏在视野之外。您需要的是从 View 中隐藏/删除它们。
从您的描述来看,您正在使用简单的约束来实现此目的。这可以通过仅使用约束来完成,但需要做更多的工作。因此,我将提到两种完成此任务的方法:
- 仅使用约束
当用户点击单元格时,您需要将底部 View 的高度设为 0。此外,如果您不希望单元格缩小时显示中间 10% 的部分,则需要创建一个附加约束顶 View 的底部到单元格 contentView
的底部。同样,您的底部 View 也将有两个高度限制,一个用于 45%,另一个用于 0。
我们的想法是同时具有这两个约束,但具有不同的优先级。初始约束将具有较高的优先级,而另一个约束将具有较低的优先级。尽管这些约束会相互矛盾,但 iOS 会采用优先级较高的约束来渲染 View 。
接下来,您需要在用户点击时切换较高优先级约束的事件属性,这将依次让 iOS 使用较低优先级约束来渲染 View 。
- 使用堆栈 View :
iOS 9 引入了堆栈 View ,它是一个辅助 View 。它基本上为您处理约束,至少是其中的一部分。当您对堆栈 View 的 subview 隐藏一个 View 时,堆栈 View 会自动将该 View 的高度设为 0。阅读有关垂直堆栈 View 的更多信息,您就会明白这一点。
关于ios - 调整包含多个 View 的 iOS 表格 View 单元格的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56099594/