UIScrollView +更改方向=搞砸了子视图(iPad)

时间:2011-09-28 06:59:49

标签: ios cocoa-touch ipad uiscrollview orientation

我想在应用中使用UIScrollView作为我的主要容器,让我可以在子视图之间来回滑动。为实现这一目标,我创建了一个UIViewController子类,其中包含UIScrollView IBOutlet

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并排放置正确的尺寸,我可以在它们之间来回滑动。

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

我不知道我应该做些什么才能调整子视图和scrollview本身的大小,或者代码中我应该做什么,我似乎无法找到任何示例。

任何人都知道该怎么做?

[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)当当前页面是例如5页的第2页时,页面在方向更改后不完全可见,但是像40像素一样在屏幕外

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

以纵向模式启动应用时:

  • 子视图的形状/边框看起来乱七八糟,见截图:

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

  • 当我旋转到横向时,一切看起来都不错,滚动效果很棒。即使我旋转回肖像,现在一切都很棒:

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

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

  • 我在纵向模式下获得相同的乱码/屏幕外毛刺

  • 在纵向和横向之间来回切换,可以将其修复为横向模式

  • 但是:纵向模式的子视图将具有横向模式的宽度,因此子视图太宽

我试图修复1)在willRotateToInterfaceOrientation中执行上面的代码但是它完全弄乱了布局。

我修正了2),将以下代码添加到didRotateFromInterfaceOrientation

// 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)

2 个答案:

答案 0 :(得分:3)

您需要重置帧大小,内容大小和内容偏移量,以便将子视图放在合适的位置。

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的中心时遇到了问题。

答案 1 :(得分:0)

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