UIScrollView + 改变方向 = 混乱的子视图(iPad)

Posted

技术标签:

【中文标题】UIScrollView + 改变方向 = 混乱的子视图(iPad)【英文标题】:UIScrollView + change orientation = messed up subviews (iPad) 【发布时间】:2011-09-28 06:59:48 【问题描述】:

我想在应用程序中使用UIScrollView 作为我的主容器,使我能够在子视图之间来回滑动。为此,我创建了一个带有UIScrollView IBOutletUIViewController 子类:

viewDidLoad 方法中我构造了子页面:

for (int i= 0; i< pageCount; i++)

   CGRect frame = self.scrollView.frame;
   frame.origin.x = frame.size.width * i;
   frame.origin.y = 0;

   UIWebView* aWebView= [[UIWebView alloc] initWithFrame:frame];

   [self.scrollView addSubview:aWebView];

启动应用程序(纵向模式)时,一切正常。也就是说,UIWebViews 以正确的尺寸并排排列,我可以在它们之间来回滑动。

当我旋转到横向时,滚动视图大小和子视图似乎都没有调整大小。

我不知道我应该做什么来调整子视图和滚动视图本身的大小,或者我应该在代码中的什么时候做任何事情,我似乎找不到任何例子。

有人知道该怎么做吗?

[edit] 尝试按照 mahboudz 的建议调整尺寸:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 

   self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * pageCount, self.scrollView.frame.size.height);

   for (int i= 0; i< pageCount; i++)
   
      CGRect frame = self.scrollView.frame;
      frame.origin.x = frame.size.width * i;
      frame.origin.y = 0;

      UIWebView* view= [[self.scrollView subviews] objectAtIndex:i];

      view.frame= frame;
   

这种做我想要的,但有以下问题:

1) 可以看到子视图在改变方向时增长到正确的屏幕尺寸

2) 当当前页面例如是第 2 页(共 5 页)时,页面在方向更改后不会完全可见,而是在屏幕外大约 40 像素

3) 根据应用是以纵向模式还是横向模式(模拟器)启动,我会得到奇怪的效果,我试着解释一下:

当应用以纵向模式启动时:

子视图的形状/边框看起来乱七八糟/离屏,请看截图:

http://i53.tinypic.com/21jr76x.png

当我旋转到横向时,一切看起来都很好,滚动效果非常好。即使我旋转回纵向,现在一切都很好:

http://i55.tinypic.com/if3iiw.png

当应用以横向模式启动时:

我遇到与纵向模式相同的混乱/屏幕外故障

在纵向和横向之间来回切换可以解决横向模式的问题

但是:纵向模式的子视图的宽度与横向模式的宽度相同,因此子视图太宽了

我尝试修复 1) 在 willRotateToInterfaceOrientation 中执行上述代码,但它完全搞砸了布局。

我通过将以下代码添加到 didRotateFromInterfaceOrientation 来修复 2):

// update the scroll view to the appropriate page

CGRect frame = self.scrollView.frame;
frame.origin.x = frame.size.width * self.currentPage;
frame.origin.y = 0;

[self.scrollView scrollRectToVisible:frame animated:NO];

注意:当前页面在scrollViewDidScroll中确定

我不知道如何解决 3)

【问题讨论】:

【参考方案1】:

您需要重置帧大小、内容大小和内容偏移量,以使子视图处于正确位置。

CGFloat screenHeight =[UIScreen mainScreen].bounds.size.height;
CGFloat screenWidth =[UIScreen mainScreen].bounds.size.width;
self.scrollView.frame = CGRectMake(0, 0, screenWidth, screenHeight);
self.scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, self.scrollView.frame.size.height);
self.scrollView.contentOffset = CGPointMake(visiblePageBeforeRotation * self.scrollView.bounds.size.width, 0);

这段代码应该放在方法中

-(void)willRotateToInterfaceOrientation: (UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration

同时检查这个问题的答案: Clean autorotation transitions in a paging UIScrollView 它有一个名为 Rotolling 的好例子,用于在启用分页的情况下旋转 UIScrollView。

希望这会有所帮助。

P.S:在旋转时重新定位 UIWebView 的中心时遇到问题。

【讨论】:

【参考方案2】:

您需要实现viewWillRotate/viewDidRotate 并根据需要调整我们的内容大小和方向。

【讨论】:

所以基本上我需要先设置contentSize(新几何*子视图计数),然后循环子视图并将frame属性设置为新几何?我是否还必须触发重绘视图 (setNeedsDisplay) 或类似内容,还是仅通过设置 frame 和 contentSize 来工作? 我认为您不需要设置NeedsDisplay。我很确定您需要调整框架/边界和 contentSize 等的大小。看看您是否可以通过使用 InterfaceBuilder(或通过代码)设置自动调整大小标志来获得一些自动移动/调整大小的帮助。

以上是关于UIScrollView + 改变方向 = 混乱的子视图(iPad)的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView contentOffset 在方向更改后损坏

UIScrollView 多页混乱

UIView、UICollectionView、UITableView、UIScrollView 的边界属性理解混乱

UIView 子视图不会改变方向

UIScrollView 方向来自 scrollViewWillBeginDecelerating

如何为 UIScrollView 启用方向锁定?