在方向更改期间,UIScrollView在SetContentSize之后自动滚动到顶部 - 我该如何防止这种情况?

时间:2011-04-14 16:54:37

标签: iphone ios ipad uiscrollview autoscroll

我有一个UIScrollView,其中启用了垂直滚动。我正在显示一个按钮网格(类似于照片查看器图像网格)。必须根据屏幕方向以不同方式绘制网格,以便使用所有屏幕空间。考虑到按钮的大小,我可以在纵向上每行3个,在横向上每行4个。

我重新定位了所有按钮:willRotateToInterfaceOrientation:duration,然后在我的UIScrollView上调用:setContentSize :.除了在调用SetContentSize之后发生的自动滚动外,一切似乎都运行得很好。换句话说,假设我是在纵向,并且在列表中向下滚动3/4,当我旋转到横向时,它会自动滚动所有背面到顶部。

有趣的是,在同一场景中,如果我要向上或向下滚动一个小动画,然后立即旋转设备,滚动视图会正确重绘,并保留当前滚动位置!

所以,要明确的是,这里的罪魁祸首似乎是SetContentSize:,但显然我必须调用它来滚动视图才能正确滚动。

关于如何保留当前滚动位置的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试实施UIScrollViewDelegate方法scrollViewShouldScrollToTop:,它告诉调用者是否滚动到顶部。您可能必须在代理中有一些标志,指示是否正在进行轮换,因为在正常情况下,您实际上可能希望能够点击状态栏并使滚动视图滚动到顶部。

另一方面,如果您不希望滚动视图自动滚动到顶部,只需实现该委托方法并让它返回NO。

答案 1 :(得分:0)

我遇到了这个问题,就这样做了,对我来说效果很好

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    //calculate percentage down scrollview currently at
    float c = self.scrollView.contentOffset.y / self.scrollView.contentSize.height;

    //reposition subviews in the scrollview
    [self positionThumbnails:toInterfaceOrientation];

    //set the new scrollview offset to the same percentage, 
    // using the new scrollview height to calculate
    self.scrollView.contentOffset = 
          CGPointMake(0, c * self.scrollView.contentSize.height);
}

在我的情况下,我有一个滚动视图,其宽度与设备大小和可变高度相同