UIScrollView按预期工作,但scrollRectToVisible:什么都不做

时间:2009-09-18 19:55:51

标签: iphone uiscrollview

之前我使用过UIScrollView,现在正在使用它,从来没有遇到过问题。我现在将它添加到一个旧的应用程序,虽然它按预期工作(我可以看看内容,用我的手指滚动,所有的边界和大小设置正确,所以内容中没有空白的空间,等等。),我无法让scrollToRectVisible工作。我甚至简化了调用,以便它只移动到0,0位置:

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

或将其移至0,200:

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

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

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

此scrollView及其内容由IB在nib中定义,并与IBOutlet一起使用。我在我的应用程序中使用的唯一代码来处理scrollView是

 [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

它仍然像我想要滚动到的矩形已经可见,并且不需要滚动。不确定这是不是正在发生的事情。这只是最神奇的事情。似乎很容易解决......

ADDENDUM#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];
}

此scrollView的其他所有内容均按预期工作,但scrollRectToVisible。为什么?!?有任何猜测吗?

8 个答案:

答案 0 :(得分:110)

一个多月后,我终于明白了。虽然上面的替代方案效果很好,但它一直困扰着我,我不得不最终解决它。原来这是一个愚蠢的错误。

这是我的viewDidLoad中的旧代码,我设置了scrollView:

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

scrollView的高度或宽度值不能为0!我认为这已经过去了,因为我假设ScrollView的大小开始时有一个有效的大小,我错过了一个维度为零的事实!

这有效:

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

希望这有助于那里的人。我确实花了太多时间试图调试它。

答案 1 :(得分:46)

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

答案 2 :(得分:5)

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

如果您在scrollView的子视图中触摸方法调用方法scrollRectToVisiblesetContentOffset,那么您的scrollView可能会通过延迟触摸来解决问题。

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

scrollView.delaysContentTouches = NO;

您很可能能够将带有和不带动画的scrollView设置为YES。

答案 3 :(得分:1)

我喜欢这样,它没有用

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

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

必须将其更改为此

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);

结果scrollView.contentSize.width未必从get go设置为有效值,因此最好给它一个特定值

答案 4 :(得分:0)

如果您没有为“clefScrollView”设置框架,上面建议的解决方案仍然会出错。

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



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

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



答案 5 :(得分:0)

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

答案 6 :(得分:0)

我有与此问题相同的症状.. scrollRectToVisible未按预期工作。我的问题是故事板上的scrollview有一个模糊的约束问题。一旦修复,通话工作就好了。当scrollRectToVisible调用未按预期工作时,还需检查其他内容。

答案 7 :(得分:0)

对我来说,问题是子视图中的约束不明确。 检查内容中的每个约束是否都已设置,即使您显然不需要布局也是如此。