【问题标题】:Make UITableView Header auto-resize as the user types in cells当用户在单元格中键入时,使 UITableView Header 自动调整大小
【发布时间】:2018-04-29 19:12:48
【问题描述】:

此用户界面允许用户在空白处输入答案(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 不再认为单元格可见时,它会在视图中被破坏。这是为了解决我在括号中提到的问题。原谅我糟糕的思想组织。

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

【问题讨论】:

  • 不确定这是否相关,但您不必创建新视图,在其中添加带有约束的单元格,然后返回这个新视图。相反,您可以使用 return cell.contentView
  • @Malik 是的!这是个好主意!它绝对比我尝试的更干净、更容易,并且解决了一半的问题。你看,现在单元格以具有正确高度的动态大小开始,但是当我输入时,如果我调用 tableview.beginUpdates() tableview.endUpdates() 整个 UI 抖动 - 每次单元格“重新加载”并向下滚动到我在哪里打字。如果我不打电话给那些,标题不再随着我的打字而增长......老问题,但更近一步!
  • 也许您可以做的一件事是不要在每个字符输入上调用开始/结束更新。相反,输入一些逻辑来检查当前标题高度是否会与处理字符后的高度不同,并且仅在需要时才调用开始/结束更新
  • @Malik 感谢您的快速回复!我喜欢这个主意,除非每次我调用开始/结束更新时,如果我向下滚动到一个单元格以键入整个列表“重新加载”并重新滚动,这会使整个事情跳跃。偶尔做一次而不是每次击键会有所帮助,但不能解决这个问题
  • @Malik 其实我不知道为什么,只是简单地返回 cell.contentview 解决了这个问题!请将其发布为答案,我会将其标记为正确答案。

标签: swift xcode uitableview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    相关资源
    最近更新 更多