【问题标题】:UIScrollView auto-scrolls to top after SetContentSize during orientation change - how can I prevent that?UIScrollView 在方向更改期间在 SetContentSize 之后自动滚动到顶部 - 我该如何防止这种情况发生?
【发布时间】:2011-04-14 16:54:36
【问题描述】:

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: iphone ios ipad uiscrollview autoscroll


    【解决方案1】:

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

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

    【讨论】:

    • 这不起作用。这与使用的效果相同:scrollView.scrollsToTop = NO;是的,这可以防止在点击状态栏时自动滚动到顶部,但是,我在原始问题中描述的行为仍然存在......
    • 另一个想法:在你打电话给setContentSize:之前,记住你在内容中的位置,然后在那个电话之后,打电话给setContentOffset:。可能是当您设置内容大小时,内容偏移量被故意重置为 (0,0)。您可能已将内容大小重置为不再包含重置大小之前的内容偏移量的内容。因此,SDK 可能在某种程度上通过确保在内容大小更改后始终显示某些内容来保护自己和用户体验。
    【解决方案2】:

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

    - (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);
    }
    

    在我的例子中,我有一个滚动视图,它的宽度固定到设备大小,高度可变

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多