我正在寻找一种调整布局更复杂的tableView
单元格大小的方法。
为简化问题描述,tableview
单元格包含三个视图。一个定义单元格“背景”的视图和两个其他视图(每个视图的高度为背景单元格的45%。
这些其他视图中的一个标记为背景视图的顶部,另一个标记为底部。
如果用户点击表格视图单元格,则其收缩方式应为仅顶视图可见,而在另一位用户点击之后,其尺寸应再次调整为全尺寸。
用户点击由功能处理
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
调整大小是通过
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
不幸的是,缩小表格视图单元格后,两个附加视图都以其原始高度的一半显示。
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
}
}
我现在正在寻找一种以某种方式更改代码的方法,即在缩小后只能看到上部视图。 Example picture of the fully visible cell 在示例图片中,缩小表视图单元格后应仅显示红色视图。
预先感谢 帕特里克
答案 0 :(得分:0)
原因是缩小单元格时,视图(由于其尺寸是相对于父级尺寸定义的)也将缩小,并且以一半大小显示。它们并没有真正从视图中消失/隐藏。您需要的是从视图中隐藏/删除它们。
从您的描述中可以看出,您正在使用简单的约束来实现此目的。这可以通过仅使用约束来完成,但是需要做更多的工作。因此,我将提到两种完成此任务的方法:
当用户点击您的单元格时,您需要将底视图的高度设置为0。此外,如果您不希望在单元格缩小时显示中间的10%部分,则需要从以下位置创建一个附加约束顶视图的底部到单元格contentView
的底部。同样,您的底视图也将有两个高度限制,一个限制为45%,另一个限制为0。
想法是同时具有这两个约束,但具有不同的优先级。初始约束将具有较高的优先级,而另一个约束将具有较低的优先级。尽管这些约束是矛盾的,但iOS会优先使用更高的渲染视图。
下一步,您需要在用户点击时切换优先级较高的约束的active属性,这将使iOS使用优先级较低的约束来呈现视图。
iOS 9引入了堆栈视图,它是一个帮助程序视图。基本上,它可以为您处理约束,至少其中一部分是约束。当您从堆栈视图的子级中隐藏一个视图时,堆栈视图将自动使该视图的高度为0。阅读有关垂直堆栈视图的更多信息,您就会明白这一点。