我遇到了 ChildViewController View 的问题,它们的框架会自动更改为 parent 的框架。我已经将它提炼成一个带有单个类的示例项目来说明正在发生的事情。

简而言之,我:

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

  • 所有 autoresizing mask/autoresizes subviews 设置为 NO。

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

    更新!
    似乎 addChildViewController 不知何故是罪魁祸首。不知道为什么 - 这是预期的行为吗?我需要能够将这些 childViewController 添加到 ScrollViewController 中,而它们的 View 框架不会自动缩放到它们的父 View 。这不是理论上的方法吗?

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

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

    来自 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));
            }
        }
    

    最佳答案

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

    关于objective-c - UIScrollView subview 容器错误地更改帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14024137/

    10-12 14:31