在UITableView

时间:2017-11-26 22:55:41

标签: ios swift uitableview uiscrollview

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

我已经做到了这样,当桌面视图向上滚动时,顶视图也会向上滚动,最多可达50个点。

tableview的顶部插图为50:

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

...以便它的单元格从顶视图开始。

在scrollview委托中,有一些代码如下:

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

这可以确保当用户向下拖动桌面视图时顶视图“粘住”它,并且当用户按下桌面视图时也会向上推。

我已经绘制了这张图片以更好地描述故事板的样子:

enter image description here

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

但是如果你向上滚动 - 所以顶视图是最小的 - 那么单元格的数量会减少,顶视图会回落到它的最大高度。

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

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

有人能想到一种在表格视图上设置最小内容大小的聪明方法吗?

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

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

更新

感谢您的所有答案和评论。

在尝试各种类型的页脚和标题视图后,调整约束和&滚动时的布局优先级,添加间隔单元格,将tableview放在滚动视图中等等 - 最后我发现我正在使这比我需要的更复杂,并且应该在scrollViewDidScroll上更新问题的原因,{ {1}}值。

请参阅下面的答案,了解实现我正在寻找的行为的代码示例。

2 个答案:

答案 0 :(得分:0)

您可以尝试一些想法:

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

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

  • ,而不是虚拟行。
  • 也许在tableView上设置最小高度约束,并保持其内容压缩阻力优先级高。

答案 1 :(得分:0)

由于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顶部会粘贴到它已向上滚动的位置(即它向上推顶视图的数量)。