UIScrollView子视图容器错误地更改帧

时间:2012-12-24 17:27:44

标签: objective-c ios uiviewcontroller uiscrollview childviewcontroller

我遇到了ChildViewController视图的问题,他们的框架会自动更改为父框架。我把它提炼成一个带有单个类的示例项目来说明发生了什么。

简而言之,我:

  • 拥有ScrollViewController
  • 将ScrollViewController添加为RootViewController并添加到Window
  • 在ScrollViewController中 - 在 ViewDidLoad 我创建一个容器UIView,其框架为{{0,0},{72704,768}}
  • 创建一个框架为{{0,0},{1024,768}}
  • 的UIScrollView
  • 将ScrollView添加到ScrollViewController视图
  • 将容器添加到ScrollView
  • 创建71个UIViewControllers,框架为{{0,0},{1024,768}}
  • 将它们添加为ScrollViewController的
  • 的ChildViewControllers
  • 将他们的子视图添加到Container
  • ViewDidAppear
  • 上记录所有71帧
  • 每帧都是{{0,0},{72704,768}} - 我设置的不是1024 x 768。

所有自动调整遮罩/自动调整子视图设置为NO。

这在iOS 6上运行,但也在iOS 5.1上运行!

更新<!/强> 似乎addChildViewController不知何故是罪魁祸首。不知道为什么 - 这是预期的行为吗?我需要能够将这些childViewControllers添加到ScrollViewController,而不会将其视图框架自动缩放到其父级。这理论上不是这样做的吗?

此外 - 任何地方都没有NIB。在Scrollview / ContainerView和71个VC视图中的每一个上将“translatesAutoresizingMaskIntoConstraints”设置为NO。同样的,不幸的是。这似乎很奇怪......

项目链接 - https://dl.dropbox.com/u/637000/TestingBug.zip

CODE FROM ScrollViewController:

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        [self initScrollView];
        [self createTestViews];
    }

    - (void)initScrollView {
        if(scrollView == nil) {
            containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 72704, 768)];
            containerView.autoresizingMask = UIViewAutoresizingNone;
            containerView.autoresizesSubviews = NO;

            scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
            scrollView.autoresizingMask = UIViewAutoresizingNone;
            scrollView.showsHorizontalScrollIndicator = NO;
            scrollView.showsVerticalScrollIndicator = NO;
            scrollView.autoresizesSubviews = NO;
            scrollView.delegate = self;

            [self.view addSubview:scrollView];
            [scrollView addSubview:containerView];
        }
    }

    - (void)createTestViews {
        for(int count = 0; count < 71; count++) {
            [self createTestView];
        }
    }

    - (void)createTestView {
        UIViewController *testVC = [[UIViewController alloc] init];
        testVC.view.frame = CGRectMake(0, 0, 1024, 768);

        [self addChildViewController:testVC];
        [containerView addSubview:testVC.view];
        [testVC didMoveToParentViewController:self];
    }

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];

        for(UIView *subview in containerView.subviews) {
            // THIS IS {{0, 0}, {72704, 768}} NOT 1024 x 768
            NSLog(@"BROKEN FRAME = %@", NSStringFromCGRect(subview.frame));
        }
    }

2 个答案:

答案 0 :(得分:3)

  

创建71个UIViewControllers,框架为{{0,0},{1024,768}}

哇!这听起来像完全不必要的使用UIViewController。没有它可以管理吗?通常的做法是直接向滚动视图添加视图,而不需要任何介入UIViewController包含foo。

更直接地解决您的问题:可能会涉及autolayout吗? (默认情况下,对于在Xcode 4.5中创建的任何新笔尖,答案是肯定的。)我没有看到你将translatesAutoresizingMaskIntoConstraints设置为NO,所以如果autolayout正在播放一部分,那么它可能正在调整视图的大小。当然,我也没有看到你开始设置任何autoresizingMask,所以你得到一个你没有负责的默认值。

答案 1 :(得分:3)

在IOS 7.0中使用self.automaticallyAdjustsScrollViewInsets = NO;在ViewDidLoad中