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

问题描述 投票:60回答:8

我之前使用过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滚动,但这不是我想要的。

此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

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

附录#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。为什么?!?任何疯狂的猜测?

iphone uiscrollview
8个回答
112
投票

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

这是我的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)];

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


47
投票

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


5
投票

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

如果你在scrollView的子视图中触摸调用方法scrollRectToVisiblesetContentOffset,那么你的scrollView可以通过延迟触摸来控制。

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

scrollView.delaysContentTouches = NO;

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


1
投票

我有这样的,它没有用

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

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

不得不改变它

scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);

原来scrollView.contentSize.width不一定从get go设置为有效值,所以最好给它一个特定的值


0
投票

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

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



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

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




0
投票

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.