我在视图控制器的顶部有一个视图,在它下面有一个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)
}
这可以确保当用户向下拖动桌面视图时顶视图“粘住”它,并且当用户按下桌面视图时也会向上推。
我已经绘制了这张图片以更好地描述故事板的样子:
到目前为止一切顺利。当有很多单元格并且用户向上滚动表格视图时,顶视图很好地保持在它的最小高度。
但是如果你向上滚动 - 所以顶视图是最小的 - 那么单元格的数量会减少,顶视图会回落到它的最大高度。
这是因为tableview的实际内容大小已经降到其边界高度以下,因此作为scrollview,它会将内容的顶部再次带到scrollview的顶部(当然还有50点顶部插入)。
我希望能够向上滚动桌面视图,因此顶视图保持在其最小高度,无论其包含的单元格数量是多少 - 即无论其内容大小如何。
有人能想到一种在表格视图上设置最小内容大小的聪明方法吗?
(到目前为止,我已尝试弄乱页脚,底部有一个基本上是间隔符的单元格 - 这会弄乱tableview的逻辑和我在那里的一些重新排序的代码。我试过了根据我的意愿强制提供等等,但还没有完全弄清楚如何实现这一目标。)
我非常感谢一些UI天才指出我正确的方向:)谢谢。
更新
感谢您的所有答案和评论。
在尝试各种类型的页脚和标题视图后,调整约束和&滚动时的布局优先级,添加间隔单元格,将tableview放在滚动视图中等等 - 最后我发现我正在使这比我需要的更复杂,并且应该在scrollViewDidScroll上更新问题的原因,{ {1}}值。
请参阅下面的答案,了解实现我正在寻找的行为的代码示例。
答案 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顶部会粘贴到它已向上滚动的位置(即它向上推顶视图的数量)。