2009-09-18 31 views
54

我之前使用过UIScrollView,现在正在使用它,并且从来没有出现问题。我现在将它添加到一个旧的应用程序,虽然它按预期工作(我可以看看内容,用我的手指滚动,所有的边界和大小设置正确,所以没有空的内容,等等),我只是不能让scrollToRectVisible工作。我甚至已经简化呼叫,以便它只是移动到0,0位置:UIScrollView按预期方式工作,但scrollRectToVisible:什么都不做

[scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES]; 

或将其移动到0,200:

[scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES]; 

我甚至做了一个快速的应用程序来测试这一点,我可以如我所期望的那样,让scrollRectToVisible在那里工作。但在我的旧应用程序中,我似乎无法让它做任何事情。

我可以使scrollView滚动setContentOffset:,但那不是我想要的。

此scrollView及其内容在IB中由笔尖定义并与IBOutlet一起使用。我用我的应用程序来处理滚动视图的唯一代码

[scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)]; 

(我只对垂直滚动感兴趣的不是水平)。

有没有人遇到过这样的问题?

我比较了两个应用程序中的scrollView属性,它们是相同的。

附录:

我scrollViews框架是:0.000000 0.000000 480.000000 179.000000

我scrollViews contentSize是:0.000000 324.000000

它仍然就像我要滚动的RECT到已经可见和不需要滚动。不知道这是怎么回事。这只是最糟糕的事情。好像这样一件容易的事情来解决...

附录#2:

这是我想提出离不开scrollRectToVisible

CGPoint point = myRect.origin; 
if (![clefScrollView pointInside:point withEvent:nil]) { 
    point.x = 0; 
    if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height) 
     point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height; 
    [clefScrollView setContentOffset:point animated: YES]; 
} 

其他一切关于这个滚动视图正常工作,但scrollRectToVisible。为什么?!?任何野生猜测?

回答

99

一个多月后,我终于明白了。虽然上面的替代方案运行良好,但它一直在困扰我,我不得不最终弄清楚。原来,这是一个愚蠢的错误。

这里是原来的代码在我viewDidLoad中,我在那里建立了滚动:

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)]; 

滚动型高度或宽度的值不能为0!我认为这超过了我,因为我认为ScrollView的大小从一个有效的大小开始,我错过了一个维度为零的事实!

这工作:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 

希望这有助于有人在那里。我肯定花了太多时间试图调试这个。

+0

谢谢!我也得到了这一点(我正在设置高度,但不是宽度)。 –

+3

这是不正确的 - c.f.猎户座的答案在下面(我有一个非零宽度/高度,它不是'0'导致问题...) – Adam

+0

我以类似的方式完成了这项工作,但仍然scrollRectToVisible无效。它在模拟器中工作,但不在设备上。请帮忙。 –

43

是的,我还没有成功与scrollRectToVisible:animated:,但setContentOffset:animated:总是适合我。出于好奇,为什么你不想使用setContentOffset:animated:?这似乎是适当的解决方案。

+3

不幸的是,setContentOffset将滚动到该点,而不管它是否已经可见。我可以做额外的工作来确定点是否可见,但是,我仍然好奇为什么scrollRectToVisible不起作用,当我看到它在我自己的样本和网上的其他样本中工作。我一定在做错事,但scrollView的代码只有三行或四行,我看不到什么?! – mahboudz

0

如果您尚未设置“clefScrollView”的框架,上面的建议解决方案可能仍会出现错误。

如果使用上述解决方案并仍然存在相同问题,请确保在设置内容视图之前初始化了scollView(本例中为clefScrollView)框架。



    clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)]; 

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)]; 



1

我曾经有过这样的,它没有工作

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue); 

我只是改变了contentSize的高度,所以我不认为这会给我任何问题,但它确实...

不得不将其更改为这个

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue); 

原来scrollView.contentSize.width不necessari请将其设置为有效值,因此最好给它一个具体的值

5

您可能想要检查并查看scrollView的delaysContentTouches属性设置为NO

如果您在scrollView的子视图中触摸方法scrollRectToVisiblesetContentOffset,那么您的scrollView可能会通过延迟触摸来控制事物。

因此,请确保在scrollView中设置了以下内容。

scrollView.delaysContentTouches = NO; 

您将很可能能够将带有或不带有动画的scrollView移动到YES。

0

有点晚,但我有同样的问题。虽然我绝对让我的scrollview的内容大小设置正确 - 甚至对高度值也是如此。即使经过广泛检查以验证帧和内容大小 - 仍然无法正常工作。我不得不调整“边界”框架高度,然后一切都很好。

0

我有这个问题相同的症状.. scrollRectToVisible不按预期工作。我的问题是故事板上的滚动视图有一个模糊的约束问题。一旦这个问题得到解决,通话就可以正常进行当scrollRectToVisible调用没有按照预期工作时,检查是另一回事。