我正在寻找一种方法来调整tableView
具有更复杂布局的单元格的大小。
为了简化问题的描述,tableview
单元格由三个视图组成。一个定义单元格“背景”的视图和两个附加视图(每个视图的高度为背景单元格的 45%。这些附加视图之一被标记到背景视图的顶部,另一个被标记在底部。如果用户点击 tableview 单元格,它应该以只有顶视图可见的方式缩小,并且在额外的用户点击后,它应该再次调整到其完整大小。
用户点击由函数处理
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
并且调整大小是由
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
不幸的是,在缩小 tableview 单元格后,两个附加视图都显示为原始高度的一半。
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
}
}
我现在正在寻找一种以某种方式更改代码的方法,即在缩小后只有上视图可见。完全可见单元格的示例图片 在示例图片中,缩小tableview 单元格后应该只显示红色视图。
提前致谢帕特里克
原因是当单元格缩小时,您的视图(因为它们的大小是相对于父级的大小定义的)也会缩小并且以一半大小可见。他们并没有真正消失/隐藏在视野之外。您需要的是从视图中隐藏/删除它们。
从您的描述来看,您正在使用简单的约束来实现这一点。这可以通过仅使用约束来完成,但需要做更多的工作。所以我将提到两种方法来完成这项工作:
当用户点击您的单元格时,您需要使底部视图的高度为 0。此外,如果您不希望单元格缩小时显示中间 10% 部分,则需要从底部创建一个额外的约束contentView
单元格底部的顶视图。同样,您的底部视图也将有两个高度约束,一个用于 45%,另一个用于 0。我们的想法是同时拥有这两个约束,但具有不同的优先级。初始约束将具有更高的优先级,而另一个将具有更低的优先级。尽管这些约束是相互矛盾的,但 iOS 会采用更高的优先级来渲染视图。
接下来,您需要在用户点击时切换较高优先级约束的 active 属性,这将反过来让 iOS 使用较低优先级约束来呈现视图。
iOS 9 引入了堆栈视图,这是一个辅助视图。它基本上为您处理约束,至少是其中的一部分。当您从堆栈视图的子视图中隐藏一个视图时,堆栈视图将自动使该视图的高度为 0。阅读有关垂直堆栈视图的更多信息,您就会明白这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句