缩小UIScrollView以关注某个页面

时间:2012-09-10 17:31:34

标签: objective-c ios cocoa-touch uiview uiscrollview

我有UIScrollView横向分页 - 类似于天气应用。在某些情况下,我想阻止用户水平滚动。简单地禁用滚动是有点刺耳 - 我宁愿复制滚动浏览最后一页的体验 - 允许滚动一点点,但由于没有更多内容,滚动视图会反弹回来。

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

2 个答案:

答案 0 :(得分:1)

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

[self.scrollView setAlwaysBounceHorizontal:YES];

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


修改

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

我们的UIScrollView包含了页面,每个页面由一个UIView或它的子类(它可能有自己的子视图)表示:

All hail 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 all 页面。剩下的我把它留作读者的练习(我一直想说xD)

答案 1 :(得分:0)

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

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

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

效率不高,但却是一种可行的选择。