我之前使用过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
。为什么?!?任何疯狂的猜测?
一个多月后,我终于明白了。虽然上面的替代方案效果很好,但它一直困扰着我,我不得不最终解决它。事实证明,这有点像一个愚蠢的错误。
这是我的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)];
希望这有助于那里的人。我确实花了太多时间试图调试它。
是的,我没有与scrollRectToVisible:animated:
取得成功,但setContentOffset:animated:
总是适合我。出于好奇,你为什么不想使用setContentOffset:animated:
?这似乎是正确的解决方案。
您可能想要检查并看到scrollView的delaysContentTouches
属性设置为NO
。
如果你在scrollView的子视图中触摸调用方法scrollRectToVisible
或setContentOffset
,那么你的scrollView可以通过延迟触摸来控制。
因此,请确保在scrollView中设置以下内容。
scrollView.delaysContentTouches = NO;
您很可能能够将带有和不带动画设置的scrollView移动到YES。
我有这样的,它没有用
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);
我只是改变了contentSize
的高度,所以我认为这不会给我任何问题,但它确实......
不得不改变它
scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);
原来scrollView.contentSize.width
不一定从get go设置为有效值,所以最好给它一个特定的值
如果您没有为“clefScrollView”设置框架,上面建议的解决方案仍可能出错。
如果使用上述解决方案并且仍然存在相同问题,请确保在设置内容视图之前初始化了scollView(在本例中为clefScrollView)框架。
clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];
[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
比赛有点晚,但我遇到了同样的问题。虽然我绝对让我的scrollview的内容大小设置正确 - 甚至过高的高度值。即使经过大量检查以验证帧和内容大小 - 仍然无法正常工作。我不得不调整“边界”框架高度,然后一切都很好。
我有与此问题相同的症状.. scrollRectToVisible未按预期工作。我的问题是故事板上的scrollview有一个模糊的约束问题。一旦修复,通话工作就好了。当scrollRectToVisible调用未按预期工作时,还需检查其他内容。
对我来说,问题是子视图中的约束不明确。检查内容中的每个约束是否都已设置,即使您显然不需要布局。