ios - 调整包含多个视图的 iOS tableviewcell
问题描述
我正在寻找一种方法来调整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。阅读有关垂直堆栈视图的更多信息,您就会明白这一点。
推荐阅读
- c++ - 从按钮(上一个窗口)获取值,然后在新窗口中使用它
- css - 页面重新加载后如何在功能反应组件的默认位置修复css滚动?
- c++ - 如何在需要两个参数的函数的向量上使用 std::ranges?
- vue.js - vue 3 监视单个状态属性
- autohotkey - Autohotkey - 我是左撇子,希望 CTRL - UP 像 WIN - TAB 一样工作
- android - 分离后关闭 ParcelFileDescriptor 文件描述符
- javascript - 在 HTML 中选中复选框后出现图像
- java - 确定无向图在Java中是否是二分图
- swift - slass/struct/enum/extension 之后的 SwiftLint 自定义间距规则
- python - 尝试将 .pb 文件转换为 .tflite 时出错