UIScrollView 不向下滚动
Posted
技术标签:
【中文标题】UIScrollView 不向下滚动【英文标题】:UIScrollView does not scroll down 【发布时间】:2012-07-19 14:44:42 【问题描述】:我遇到了一个奇怪的问题,scrollview
不能向下滚动,只能向上滚动。我的应用中有scrollview
,请看我的编码
.....
self.scrollView = [[UIScrollView alloc] initWithFrame: CGRectMake(0, 0, 320,427)];
[self.view addSubViews: self.scrollView];
UIView *blueView = [[UIView alloc] initWithFrame: CGRectMake(0, 47, 320, 320)];
blueView.backgroundColor = [UIColor blueColor];
[self.scrollView addSubViews: blueView];
self.scrollView.contentSize = CGSize(320, 640);
....
我的问题是无论我更改了什么值contentSize
,我的ScrollView
只能向上滚动,不能向下滚动。我希望用户可以将blueView
从原始位置移动到 iPhone 屏幕的顶部或底部。
你有这个问题吗?
【问题讨论】:
如果任何一个答案对你有帮助,你应该按照*** FAQ接受它 【参考方案1】:问题
您的问题似乎在于您如何在 scrollView
中定位 blueView
。您正在将 blueView
的框架设置为 CGRect
(0, 47, 320, 320)
。当你这样设置框架时,你隐含的一件事是:
blueView
的上边缘比scrollView
的上边缘低 47 点。
这是一个完全正确的说法,但它是导致您描述的问题的原因。 scrollView
不会向下滚动,因为它被设计为在默认情况下以矩形 (0, 0, 320, 480)
开始。 contentSize
属性仅指示UIScrollView
内内容的大小,而不是其位置。当你设置它时,你基本上是在告诉scrollView
:
从您的内容来源开始,内容宽 320 磅,高 640 磅。
因此,scrollView
不会向上滚动,因为据它所知,坐标 (0, 0)
上方没有内容。
解决方案
您需要采取三个步骤来获得所需的功能。
-
将
contentSize
设置为足够大,以允许blueView
一直向上和向下滚动。
将blueView
放在scrollView
的垂直中心。
滚动scrollView
,使其最初以blueView
为中心。
contentSize
设置为足够大,以允许blueView
一直向上和向下滚动。
我们要计算contentSize
属性的正确值。它属于CGSize
类型,因此我们需要两个部分:width
和height
。 width
很简单——因为您似乎不需要水平滚动,只需将其设为屏幕宽度即可,320
。身高有点棘手。如果您希望blueView
在向上或向下滚动时只需触摸屏幕的顶部和底部,则需要进行一些数学运算。正确的总高度将是屏幕高度的两倍,减去blueView
的高度。所以:
scrollView.contentSize = CGSizeMake(320, 480 * 2.0 - blueView.frame.size.height);
将blueView
放在scrollView
的垂直中心。
这很容易;只需设置 blueView 的 center
属性:
blueView.center = CGPointMake(160, scrollView.contentSize.height / 2.0);
滚动scrollView
,使其最初以blueView
为中心。
如果您检查Apple UIScrollView documentation,您将看到一个实例方法- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated
。这正是您以编程方式滚动scrollView
所需要的。您想要的矩形是以blueView
为中心的矩形,具有 iPhone 屏幕的大小。所以:
CGRect targetRect = CGRectMake(0, scrollView.contentSize.height / 2.0 - 240,
320, 480);
[scrollView scrollRectToVisible:targetRect animated:NO];
确保您在viewWillAppear
中进行此滚动操作,以便在用户看到视图时立即准备好。
应该是这样的。如果您有任何问题,请告诉我!
【讨论】:
【参考方案2】:scrollView 的内容大小应该是它所持有的视图的大小。代码应该是这样的,试试这样吧。
self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(X, Y, W, H1)];
UIView * blueView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, W, H2)];
self.scrollView .contentSize = blueView.frame.size;
[self.scrollView addSubview:blueView];
[self.view addSubView: self.scrollView];
感谢莱利。这里,H1 是 UIScrollVIew 的高度,H2 是 blueView 的高度和 (H1
【讨论】:
我认为这不会达到 rohou 想要的效果;这将不允许在屏幕上上下滚动blueView
。
为什么会这样?我使用这样的滚动视图,对我来说效果很好。
rohou 希望blueView
不会填满整个屏幕,但能够向上滚动到屏幕的顶部或底部。此代码将创建一个与blueView
完全相同大小的UIScrollView
,以及与blueView
相同大小的contentSize
,这意味着它不会滚动。以上是关于UIScrollView 不向下滚动的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView 不使用 RubyMotion 滚动