1

我遇到了一个奇怪的问题,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 屏幕的顶部或底部。

你有这个问题吗?

4

2 回答 2

3

问题

看起来您的问题在于您如何blueViewscrollView. 您正在将框架设置blueViewCGRect (0, 47, 320, 320). 当你像这样设置框架时,你隐含的一件事是:

的上边缘比 的上边缘blueView低 47 点scrollView

这是一个完全有效的说法,但这就是导致您描述的问题的原因。 scrollView不会向下滚动,因为它被设计为在默认情况下以 rect(0, 0, 320, 480)的形式开始。该contentSize属性仅指示 中内容的大小UIScrollView,而不是其位置。当你设置它时,你基本上是在告诉scrollView

从您的内容来源开始,内容为 320 点宽和 640 点高。

因此,scrollView不会向上滚动,因为据它所知,坐标上方没有内容(0, 0)


解决方案

您需要采取三个步骤来获得所需的功能。

  1. 将 设置为contentSize足够大以允许blueView一直向上和向下滚动。
  2. 放在blueView的垂直中心scrollView
  3. 滚动scrollView,使其最初以 为中心blueView

  • 将 设置为contentSize足够大以允许blueView一直向上和向下滚动。

我们要计算contentSize属性的正确值。它的类型是CGSize,所以我们需要两部分:widthheightwidth很简单——因为您似乎不想水平滚动,只需将其设置为屏幕的宽度,320. 身高有点棘手。如果您只想blueView向上或向下滚动时触摸屏幕的顶部和底部,则需要进行一些数学运算。正确的总高度将是屏幕高度的两倍,减去blueView. 所以:

scrollView.contentSize = CGSizeMake(320, 480 * 2.0 - blueView.frame.size.height);
  • 放在blueView的垂直中心scrollView

这很容易; 只需设置centerblueView 的属性:

blueView.center = CGPointMake(160, scrollView.contentSize.height / 2.0);
  • 滚动scrollView,使其最初以 为中心blueView

如果您查看Apple UIScrollView 文档,您会看到一个实例方法- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated。这正是您需要以scrollView编程方式滚动的内容。你想要的矩形是以blueViewiPhone 屏幕大小为中心的矩形。所以:

CGRect targetRect = CGRectMake(0, scrollView.contentSize.height / 2.0 - 240,
                               320, 480);
[scrollView scrollRectToVisible:targetRect animated:NO];

确保您在 中进行此滚动操作viewWillAppear,以便在用户看到视图时立即准备好。

应该是这样的。如果您有任何问题,请告诉我!

于 2012-07-19T15:32:05.213 回答
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 < H2)。

于 2012-07-19T15:06:24.787 回答