调整包含多个视图的iOS tableviewcell的大小

时间:2019-05-12 13:13:16

标签: ios uitableview uiview resize

我正在寻找一种调整布局更复杂的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 在示例图片中,缩小表视图单元格后应仅显示红色视图。

预先感谢 帕特里克

1 个答案:

答案 0 :(得分:0)

原因是缩小单元格时,视图(由于其尺寸是相对于父级尺寸定义的)也将缩小,并且以一半大小显示。它们并没有真正从视图中消失/隐藏。您需要的是从视图中隐藏/删除它们。

从您的描述中可以看出,您正在使用简单的约束来实现此目的。这可以通过仅使用约束来完成,但是需要做更多的工作。因此,我将提到两种完成此任务的方法:

  1. 仅使用约束

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

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

  1. 使用stackview:

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