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 类型,因此我们需要两个部分:widthheightwidth 很简单——因为您似乎不需要水平滚动,只需将其设为屏幕宽度即可,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 滚动

调整容器 uiscrollview 中所有 uiscrollview 的大小

UIScrollView 不向下滚动

UIScrollView 应该只向下滚动

何时使用 UITouch 与 UIScroll

UIScroll 视图未按预期工作