首页 > 解决方案 > 调整包含多个视图的 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 单元格后应该只显示红色视图。

在此先感谢帕特里克

标签: iosuitableviewuiviewresize

解决方案


原因是当单元格缩小时,您的视图(因为它们的大小是相对于父级的大小定义的)也会缩小并且以一半大小可见。它们并没有真正消失/隐藏在视图中。您需要的是从视图中隐藏/删除它们。

从您的描述中可以看出,您正在使用普通约束来实现这一目标。这可以通过仅使用约束来完成,但需要做更多的工作。所以我会提到两种方法来完成这项工作:

  1. 仅使用约束

当用户点击您的单元格时,您需要将底部视图的高度设置为 0。此外,如果您不希望在单元格收缩时显示中间 10% 部分,则需要从底部创建一个额外的约束单元格底部的顶视图contentView。同样,您的底视图也将有两个高度约束,一个为 45%,一个为 0。想法是同时具有这两个约束,但具有不同的优先级。初始约束将具有较高的优先级,而另一个约束将具有较低的优先级。尽管这些约束会相互矛盾,但 iOS 将采用优先级更高的约束来呈现视图。

接下来,您需要在用户点击时切换较高优先级约束的 active 属性,这反过来会让 iOS 使用较低优先级约束来呈现视图。

  1. 使用堆栈视图:

iOS 9 引入了堆栈视图,它是一个辅助视图。它基本上为您处理约束,至少是其中的一部分。当您从堆栈视图的子视图中隐藏一个视图时,堆栈视图会自动将该视图的高度设为 0。阅读有关垂直堆栈视图的更多信息,您就会明白这一点。


推荐阅读