如何将标题固定在仅在 x 维度上滚动的 UIScrollView 之上?

Posted

技术标签:

【中文标题】如何将标题固定在仅在 x 维度上滚动的 UIScrollView 之上?【英文标题】:How can you pin a header overtop of a UIScrollView that only scrolls in the x dimension? 【发布时间】:2012-03-27 18:30:27 【问题描述】:

我有一个 UIScrollView 显示一些图形数据,它在屏幕顶部有一个 x 轴。目前,当您向下滚动时,x 轴会消失,因为它只是 UIScrollView 的子视图,但我希望它始终固定在屏幕顶部,以便用户可以看到 x 轴值。

通常我只是将这个轴放在滚动视图的顶部,这样它就不会滚动,但是每当水平滚动发生时我仍然需要它与 UIScrollView 一起滚动,因为 x 轴不完全适合视图。

我不知道该怎么做。我想了几种方法。

    我可以从 ScrollView 中移除 x 轴,然后将其放入自己的 UIView 中,然后使用滚动视图委托方法在水平滚动之后和期间将 x 轴与滚动视图的新位置同步。 我可以以某种方式复制水平滚动事件并将它们传递给 x 轴视图(在这种情况下将是另一个 UIScrollView)。

我很犹豫要不要尝试第一个,因为我认为动画会生涩,或者至少与滚动视图的水平滚动不同步,我希望它们完全同步。

我犹豫要不要尝试第二个,因为我不确定这是否可行。

我正在寻找有关如何解决此问题的建议(最好是从以前做过类似事情的人那里)。

提前致谢!

【问题讨论】:

【参考方案1】:

我相信您的第二种方法会奏效。使您的视图控制器成为 2 向滚动视图的 UIScrollViewDelegate 并使用 scrollViewDidScroll: 通过调整滚动标题来同步定位。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    CGPoint offset = [scrollView contentOffset];
    CGPoint headOffset = CGPointMake(offset.x, 0.0f);
    [self.headScroller setContentOffset:headOffset animated:NO];

这假定“headScroller”已关闭用户交互并且没有委托。它只在程序控制下滚动。

【讨论】:

嘿,菲利普如果我错了,请纠正我,但这不会导致生涩的动画吗?滚动会发生,然后轴的位置会在没有动画的情况下更新?我是滚动的轴,与主 UIScrollView 完全同步 在一个简单的测试中,没有明显的延迟。我怀疑这仍然是正确的,因为似乎委托通知发生在刷新物理显示的事件周期结束之前。少量的代码不足以让用户在他们做出手势和视图移动的时间之间看起来像延迟。 (在带有几个任意图像的虚拟应用程序中尝试很容易。) scrollViewDidScroll 中的视图框架的任何手动更改都由合成系统收集,并将在与滚动视图位置更改相同的绘制周期中绘制,因此它是“固定”的正确位置视图或执行任何其他视图重新定位以考虑滚动视图的移动。

以上是关于如何将标题固定在仅在 x 维度上滚动的 UIScrollView 之上?的主要内容,如果未能解决你的问题,请参考以下文章

如何在仅在前台运行的后台命令中运行?

如何仅在正文上启用反弹过度滚动(而不是页眉和页脚)?

iOS 上的 Safari 仅在滚动停止后显示固定元素

仅在滚动到底部时将页脚固定到底部

如何在仅在 iOS-6 中支持横向方向的应用程序中使用 UIImagePickerController?

使用d3.js滚动时如何将x轴保持在固定位置?