ios - UIScrollView + 改变方向 = 困惑的 subview (iPad)

标签 ios cocoa-touch ipad uiscrollview orientation

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

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 大小和 subview 都没有调整大小。

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

有谁知道该怎么做?

[编辑] 尝试按照 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)可以看到 subview 在改变方向时增长到正确的屏幕尺寸

2)当当前页面是,例如,5页中的第2页,页面在方向改变后不是完全可见的,而是离屏大约40像素

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

当应用程序以纵向模式启动时:
  • subview 的形状/边框看起来很乱/离屏,见截图:

  • http://i53.tinypic.com/21jr76x.png
  • 当我旋转到横向时,一切看起来都很好,滚动效果很好。即使我旋转回纵向,现在一切都很好:

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

    当应用程序以横向模式启动时:
  • 我得到与纵向模式相同的困惑/屏幕外故障
  • 在纵向和横向之间来回切换可以解决横向模式的问题
  • 但是:纵向模式将具有横向模式宽度的 subview ,因此 subview 太宽

  • 我试图修复 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)

    最佳答案

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

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

    关于ios - UIScrollView + 改变方向 = 困惑的 subview (iPad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579412/

    相关文章:

    ios - UICollectionView NSIndexPath?

    ios - 将触摸事件从 View 发送到 Controller

    iphone - cocos2D 从 iPhone 到 iPad

    iphone - 启动电话应用程序以调用没有号码的电话

    ios - 用户个人资料中的 Facebook 名称

    ios - Apple Pay 可以用于使用企业配置文件签名的应用程序吗?

    iphone - bundle 标识符与先前的 bundle 标识符不同

    iOS 可重用组件

    ios - cocoa touch : Multiple line text input

    javascript - iPad ajax问题