Objective c 缩小UIScrollView以聚焦于特定页面
我有一个带有水平分页的Objective c 缩小UIScrollView以聚焦于特定页面,objective-c,ios,cocoa-touch,uiview,uiscrollview,Objective C,Ios,Cocoa Touch,Uiview,Uiscrollview,我有一个带有水平分页的UIScrollView——类似于天气应用程序。在某些情况下,我希望防止用户水平滚动。简单地禁用滚动有点不和谐-我更愿意复制滚动过最后一页的体验-允许进行一点滚动,但由于没有更多内容,滚动视图会反弹回来 我该如何实施这一点?我应该更改ScrollView的contentSize吗?如何设置分页,以便有效地有一个“页面”,但仍有内容显示在紧邻的左侧和右侧?要始终使UIScrollView反弹,即使只有一个页面,请添加以下行: [self.scrollView setAlway
UIScrollView
——类似于天气应用程序。在某些情况下,我希望防止用户水平滚动。简单地禁用滚动有点不和谐-我更愿意复制滚动过最后一页的体验-允许进行一点滚动,但由于没有更多内容,滚动视图会反弹回来
我该如何实施这一点?我应该更改ScrollView的contentSize吗?如何设置分页,以便有效地有一个“页面”,但仍有内容显示在紧邻的左侧和右侧?要始终使
UIScrollView
反弹,即使只有一个页面,请添加以下行:
[self.scrollView setAlwaysBounceHorizontal:YES];
当然,除了我关于缩小contentSize
的评论之外
编辑: 好的,让我先解释一下我们想要实现的目标。用户正在
UIScrollView
中的页面之间愉快地滚动,突然,我们希望UIScrollView
能够坚持当前页面,,它可能是也可能不是第一页
我们的uicrollview
具有页面布局,每个页面由单个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)];
}
注意:如果您有一个复杂的视图层次结构,只需将其包装在一个
UIView
中,该视图的边界大小等于\u scrollView.contentSize
和所有页面。剩下的我留给读者作为练习(我一直想说xD)上面Mazyod的答案可能是最好的答案,但是我很难将视图返回到原始位置,并以一种对用户隐藏的方式调整contentSize
的大小。我使用了下面的方法
我只需创建一个大小有限的新scrollview,并将其放置在现有scrollview的顶部。我将三个视图(正在使用的一个视图和两边的视图)移动到这个临时滚动视图中,根据Mazyod的回答调整它们的原点
当需要恢复时,我只需将视图移回真实的scrollview并删除临时视图
效率不高,但这是一个可行的选择。只需缩小内容大小。将内容大小的宽度设置为1*内容的宽度将完全停止滚动,而不会反弹。谢谢。我还需要弄清楚如何调整
contentOffset
或其他一些属性,否则调整contentSize
的大小会迫使我的UIScrollView
滚动到内容的一个可查看部分。@BenPackard simple。首先,是否直接将子视图(页面)添加到UIScrollView
?或者您是否有一个包含UIScrollView
中的视图的UIView
?(即滚动视图->视图->页面)?前者。每个视图都被添加为UIScrollView
@BenPackard的子视图好吧,如果是后者,我会马上发布代码。让我快速测试一下,然后发布解决方案。这非常有用-谢谢。我怀疑我需要以某种方式暂时“改变”观点。这是非常清楚和简洁的。我将试一试,看看它会把我带到哪里——显然,当我需要重新启用滚动时,我也应该执行反向移位(并同样增加contentSize
)。