objective-c - UIScrollView subview 容器错误地更改框架

标签 objective-c ios uiviewcontroller uiscrollview childviewcontroller

我在将 ChildViewController View 的框架自动更改为其 parent 的框架时遇到问题。我已将它提炼成一个包含单个类的示例项目来说明发生了什么。

简而言之,我:

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

所有自动调整掩码/自动调整 subview 设置为否。

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

更新! 似乎 addChildViewController 是某种程度上的罪魁祸首。不知道为什么 - 这是预期的行为吗?我需要能够将这些 childViewControllers 添加到 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/

相关文章:

ios - 我应该什么时候设计 UINavigationBar?

ios - 当我们将一个 View Controller 导航到另一个 View Controller 时,这之间有什么不同

iphone - 将 View 发送到后面

iphone - 选择器没有已知的实例方法

IOS Objective-C : Displaying Messages Dilemma

ios - 使用不同的内存创建 NSString

ios - 我很难从 objective-c 中的复制对象中保留属性值

ios - 将数据从一个 ViewController 中的某些 TextFields 传递到另一个 ViewController 中的 TextView

objective-c - Xcode 4.2 小数位

ios - 在 iOS 应用程序中保持计数器在后台运行