【问题标题】:Setting a minimum content size on a UITableView在 UITableView 上设置最小内容大小
【发布时间】:2017-11-26 22:55:41
【问题描述】:

我在视图控制器的顶部有一个视图,在它下面有一个表格视图。

我已经做到了,当 tableview 向上滚动时,top view 也向上滚动,最多可以说 50 个点。

tableview 的 top inset 也是 50:

tableView = UIEdgeInsets(top: 50, left: 0, bottom: 0, right: 0)

...所以它的单元格从顶视图下方开始。

在滚动视图委托中有一些代码如下:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let scrollViewYOffset = ...
    topViewHeightConstraint.constant = max(minTopViewHeight, minTopViewHeight - scrollViewYOffset)
}

这样可以确保当用户在 tableview 上向下拖动时,顶视图会“粘”在上面,并且当用户向上推 table view 时也会向上推。

我画了这张图是为了更好地描述故事板的样子:

到目前为止一切顺利。当有很多单元格并且用户向上滚动表格视图时,顶视图很好地保持在它的最小高度。

但是如果您向上滚动 - 因此顶视图处于其最小值 - 那么单元格的数量会减少,顶视图会回落到它的最大高度。

这是因为 tableview 的实际内容大小已降至其边界高度以下,因此作为滚动视图,它会将内容的顶部再次带到滚动视图的顶部(当然还有 50 点的顶部插图)。


我希望能够向上滚动表格视图,因此顶视图保持在其最小高度,无论它包含多少单元格 - 即无论它的内容大小如何。

谁能想到一个聪明的方法来设置表格视图的最小内容大小?

(到目前为止,我已经尝试过弄乱页脚,在底部有一个基本上是间隔符的单元格 - 这会弄乱 tableview 的逻辑和我在那里的一些重新排序代码。我尝试过根据我的意愿强制提供报价等,但还没有完全弄清楚如何实现这一点。)

非常感谢一些 UI 天才为我指明正确的方向 :) 谢谢。

更新:

感谢您的所有回答和 cmets。

在尝试了各种类型的页脚和页眉视图、调整滚动约束和布局优先级、添加间隔单元格、将 tableview 放入滚动视图等之后 - 我终于意识到我让这比我需要的更复杂,并且应该只更新scrollViewDidScroll上的问题原因contentInset值。

请参阅下面的答案以获取实现我正在寻找的行为的代码示例。

【问题讨论】:

  • 您是否尝试过设置空 tableView.tableViewFooter 并使用其框架(高度),或者您只是尝试了一个假单元格? TableViewFooter 不会影响您的单元格逻辑。
  • 我不确定您为什么需要设置最小内容大小。如果我理解您要正确执行的操作,您应该在视图控制器上创建顶视图,然后在顶视图下方添加一个表格视图,并将表格视图的顶部固定到顶视图的底部。为顶视图的高度约束创建一个出口。当你滚动时,使用 scrollview 委托方法来缩短顶视图的高度,直到它达到最小高度。因为 tableview 被固定在顶视图的底部,它会随着太视图变小而向上移动。
  • @PredragSamardzic 是的,我尝试了页脚。问题是它粘在底部,所以出现在单元格上。假单元格选项更好,但它不适用于我在那里的一些重新排序 UI。
  • @Jon Cox 我不是指节页脚,而是 tableFooter。 tableView.tableViewFooter - 那个不粘。此外,如果您希望节页眉/页脚不粘,请将 tableView 样式更改为分组而不是普通(如果您想从分组的 tableView 中消除默认的节页眉/页脚,只需将它们的高度设置为 0.01 或 CGFloat)

标签: ios swift uitableview uiscrollview


【解决方案1】:

由于contentInset 是导致tableview ping 回错误点的原因,我只需要在tableview 向上/向下滚动时调整内容插入。

这是我所做的一些示例代码:

let maxPointsTopViewCanMoveUp: CGFloat = 50

let topInset = abs(min(max(-maxPointsTopViewCanMoveUp, scrollView.contentOffset.y), 0))
scrollView.contentInset = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)
scrollView.scrollIndicatorInsets = UIEdgeInsets(top: topInset, left: 0, bottom: 0, right: 0)

let amountToMoveTopViewUp = maxPointsTopViewCanMoveUp - topInset
topViewToSuperviewTopConstraint.constant = amountToMoveTopViewUp

这是从 tableview 的scrollViewDidScroll 调用的。

这意味着当tableview中的单元格太少而无法填充内容时,tableview的顶部会粘在它向上滚动到的位置(即它向上推顶视图的量)。

【讨论】:

    【解决方案2】:

    您可以尝试的一些想法:

    • 在索引 0 上创建一个“虚拟”行并使其高度为 50(它将隐藏在顶视图下方)。也许您可以将那个虚拟行留在第 0 节中,而将其余数据留在第 1 节中,这样您在删除数据时就不必考虑它了。

    • 或者,您可以将tableView的标题高度设置为50

    • ,而不是虚拟行
    • 可以在tableView上设置一个最小高度约束,并保持它的内容抗压缩优先级高。

    【讨论】:

    • 感谢迪奥戈的回答。虚拟行是个好主意,但不幸的是它弄乱了我的一些重新排序的 UI。
    • 今晚我会再试其他的并报告。
    • 希望一切顺利!如果您想要该隐藏区域的固定内容,我认为 tableView 标题将是最佳选择。
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多