0

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

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

4

2 回答 2

1

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

[self.scrollView setAlwaysBounceHorizontal:YES];

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


编辑:

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

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

万岁 MBP_RD

现在,要执行解释的任务,这里是代码:

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)];
}

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

于 2012-09-11T18:32:38.823 回答
0

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

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

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

效率不高,但可行的替代方案。

于 2012-09-13T20:21:23.773 回答