首页 > 解决方案 > 使 UITableView Header 在用户输入单元格时自动调整大小

问题描述

此 UI 允许用户在空白处输入答案(TableViewCells),并且标题将预览最终答案,其中空白填充到原始问题中。

比如这里的问题提示应该是“构成水分子的元素是(____)和(____)”。

但用户界面显示:

在此处输入图像描述

如您所见,标题视图正在截断内容。我希望视图调整大小以适应那里的任何文本,即使用户键入并且分​​机变得更长。这是用于创建标题视图的 TableViewController 代码:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableCell(withIdentifier: "OPCell") as! WhatTheBlankOriginalPostTableViewCell

    cell.OriginalPostLabel.text = WhatTheBlankUtility.PostText(post: (post?.content.text)!)
    opCell = cell

    let view = UIView()
    view.addSubview(cell)

    let margins = view.layoutMarginsGuide

    cell.leadingAnchor.constraint(equalTo: margins.leadingAnchor, constant: 8).isActive = true
    cell.trailingAnchor.constraint(equalTo: margins.trailingAnchor, constant: 8).isActive = true
    cell.topAnchor.constraint(equalTo: margins.topAnchor, constant: 16).isActive = true
    cell.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: 16).isActive = true

    return view;
}

请注意,我包装了标题视图(最初是一个单元格,自动调整大小并且工作正常!但是每当它更新大小时 - 我使用

Tableview.beginUpdates()
Tableview.endUpdates()

如果你向下滚动太远,整个 tableview 会抖动,如果你向下滚动太多,比如空白 20,标题视图就会消失。我看到的理论是,因为我返回了 TableViewCell 而不是 UITableViewHeaderFooterView,当tableview 不再认为单元格是可见的,它会被破坏)在视图中。这是为了解决我在括号中提到的问题。原谅我糟糕的思想组织。

我还尝试通过将单元格内部固定到代码中的视图边界来调整标题视图的大小(自动约束)。没有运气 - 当用户键入并且字符串变长时,标题视图的大小没有变化。

标签: swiftxcodeuitableview

解决方案


如果您创建一个新视图并在 中添加约束viewForHeaderInSection,则会导致奇怪的行为。对于初学者,每次viewForHeaderInSection调用它都会添加新的约束。由于在此方法中添加约束之前不会删除约束,因此会导致重复约束,我只能想象那将是一场多么噩梦。一个简单的解决方案是只返回cell.contentView您的viewForHeaderInSection方法。


推荐阅读