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

mah*_*udz 61 iphone uiscrollview

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

 [scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];
Run Code Online (Sandbox Code Playgroud)

或将其移至0,200:

 [scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

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

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

 [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)

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

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

我比较了两个应用程序中的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];
}
Run Code Online (Sandbox Code Playgroud)

关于此scrollView的其他所有内容都按预期工作,但是scrollRectToVisible.为什么?!?任何疯狂的猜测?

mah*_*udz 113

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

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

[clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)

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

这有效:

[clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
Run Code Online (Sandbox Code Playgroud)

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

  • 这不太正确 - 比如下面的猎户座的答案(我有一个非零的宽度/高度,它不是'0'导致问题......) (3认同)

Jon*_*ing 47

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

  • 不幸的是,setContentOffset将滚动到该点,无论它是否已经可见.我可以做额外的工作来确定点是否可见,但是,我仍然很好奇为什么scrollRectToVisible无效,当我看到它在我自己的样本和网上的其他样本中工作时.我一定做错了,但是对于scrollView只有三到四行代码,我看不到什么?! (4认同)

小智 5

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

如果您在滚动视图的子视图中调用方法scrollRectToVisiblesetContentOffset触摸,那么您的scrollView可能会通过延迟触摸来保持状态.

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

scrollView.delaysContentTouches = NO;
Run Code Online (Sandbox Code Playgroud)

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