缩小 UIScrollView 以专注于某个页面

Posted

技术标签:

【中文标题】缩小 UIScrollView 以专注于某个页面【英文标题】:Shrinking a UIScrollView to focus on a certain page 【发布时间】:2012-09-10 17:31:33 【问题描述】:

我有一个带有水平分页的UIScrollView - 类似于天气应用程序。在某些情况下,我想阻止用户水平滚动。简单地禁用滚动有点刺耳 - 我更愿意复制滚动过去最后一页的体验 - 允许稍微滚动,但由于没有更多内容,滚动视图会反弹。

我该如何实施呢?我应该更改 ScrollView 的 contentSize 吗?如何设置分页,以便有效地有一个“页面”但仍然有内容显示在紧邻的左侧和右侧?

【问题讨论】:

只是缩小内容大小。 将内容大小的宽度设置为 1 * 内容的宽度只是完全停止滚动,没有反弹。 【参考方案1】:

为了始终使UIScrollView 反弹,即使只有一页,添加以下行:

[self.scrollView setAlwaysBounceHorizontal:YES];

当然,除了我关于缩小contentSize 的评论。


编辑:

好的,让我先解释一下我们想要实现的目标。用户在UIScrollView 的页面之间愉快地滚动,突然间,我们希望UIScrollView 停留在当前页面,可能是也可能不是第一页

我们的UIScrollView 有页面布局,每个页面由一个UIView 或其子类表示(它本身可能有子视图):

现在,要执行解释的任务,代码如下:

CGFloat pageWidth = _scrollView.bounds.size.width;
int currentPage = (_scrollView.contentOffset.x / pageWidth);

[_scrollView setContentSize:CGSizeMake(pageWidth, _scrollView.contentSize.height)];
// move each page to the left:
for (UIView* page in _scrollView.subviews) 
    [page setFrame:CGRectOffset(page.frame, -currentPage * pageWidth, 0)];

注意:如果您有一个复杂的视图层次结构,只需将其包装在一个边界大小等于_scrollView.contentSizeUIView 中,并带有所有页面.其余的我留给读者作为练习(我一直想说xD)

【讨论】:

谢谢。我还需要弄清楚如何调整 contentOffset 或其他一些属性,我认为 - 否则调整 contentSize 的大小会强制我的 UIScrollView 滚动到内容的可见部分。 @BenPackard 很简单。首先,您是否只是将子视图(页面)直接添加到UIScrollView?或者您是否有一个包含UIScrollView 中的视图的UIView? (即滚动视图 -> 视图 -> 页面)? 前者。每个视图都作为UIScrollView 的子视图添加。 @BenPackard 好的,如果是后者,我会立即发布代码。让我快速测试一下,然后发布解决方案。 这很有帮助 - 谢谢。我怀疑我需要以某种方式暂时“改变”观点。这是非常清晰和简洁的。我会试一试,看看它会把我带到哪里——显然,当我需要重新启用滚动时,我也应该执行反向移动(同样增加contentSize【参考方案2】:

上面 Mazyod 的答案可能是最好的答案,但是我在将视图返回到其原始位置并以对用户隐藏的方式调整 contentSize 的大小时遇到​​了很多麻烦。我改用了以下方法。

我只是创建一个大小有限的新滚动视图,然后将它放在现有滚动视图的顶部。我将三个视图(正在使用的视图和两侧的视图)移动到这个临时滚动视图中,根据 Mazyod 的回答调整它们的原点。

当我需要还原时,我只需将视图移回真正的滚动视图并删除临时视图。

效率不高,但可行。

【讨论】:

以上是关于缩小 UIScrollView 以专注于某个页面的主要内容,如果未能解决你的问题,请参考以下文章

在不使用捏/UIScrollView 的情况下缩小照片

将 UINavigationBar 附加到 UIScrollView 以获得缩小的标题

散列对象的快速方法专注于包含某个属性的属性?

滚动 UIScrollView 时如何缩放

如何同时使用 UIScrollView 和 UITableView 实现平滑滚动?

缩小 UIScrollView