在加载新子视图之前调用的UIScrollView的setContentOffset

时间:2011-07-27 08:41:19

标签: iphone animation uiview uiscrollview

我有一个UIView,我正在使用UIScrollView滑动。代码如下所示:

[view setObject:object]; // updates a bunch of labels, images, etc
[scrollView addSubview:view];
[scrollView setContentOffset:CGPointMake(320,0) animated:YES];

问题是,在动画化其contentOffset之前,scrollView似乎没有等待视图完全加载,因此动画有点不稳定(在第一个幻灯片和旧设备上几乎不存在)。奇怪的是,将第3行切换为此修复了它:

[UIView animateWithDuration:0.3 animations:^{
    [scrollView setContentOffset:CGPointMake(320,0) animated:NO];
}];

没有任何延迟,完全顺利的滑入。但是,这不会触发任何UIScrollViewDelegate调用,我也依赖它(但不负责延迟)。

在设置其contentOffset动画之前,我是怎么告诉UIScrollView等待视图完全加载的?或者也许我还缺少其他东西?

编辑:在其他人建议之前:是的,我确实尝试过:

[self performSelector:@selector(slideIn) withObject:nil afterDelay:1];

只是为了看它是否会解决它。是的,它确实解决了滞后问题,但这不是一个实际的解决方案。 performSelector:afterDelay:永远不是一个解决方案,它只是一个肤浅的解决方案。此外,您每次都要让用户等待额外的秒数(因为根据设备型号,实际延迟可能会短于1秒)。

3 个答案:

答案 0 :(得分:1)

您是否尝试过在viewcontroller的“viewDidAppear”函数中开始滚动...也许在加载完成时会调用它。

否则尝试延迟很短的时间,如0.01 ..以便在当前工作完成后安排呼叫。

答案 1 :(得分:1)

在延迟0.01之后执行选择器是有效的,因为调用是在runloop上调度的,而不是立即调用方法。就此而言,afterDelay:0.0也可以工作。没有尝试过这种特殊情况,但可能在类似的情况下工作。

答案 2 :(得分:0)

试试这个,在延迟一段时间后设置contentSize(此处延迟为2秒)。

[view setObject:object];
[scrollView addSubview:view];
[self performSelector:@selector(contentSize) withObject:nil afterDelay:2];
}
-(void) contentSize {
[scrollView setContentOffset:CGPointMake(320,0) animated:YES];
}