【问题标题】:UIScrollView Subview Container Incorrectly Changing FramesUIScrollView 子视图容器错误地更改帧
【发布时间】:2012-12-11 00:58:27
【问题描述】:

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

简而言之,我:

  • 有一个 ScrollViewController
  • 将 ScrollViewController 添加为 RootViewController 并添加到 Window
  • 在 ScrollViewController - 在 ViewDidLoad 我创建了一个具有 {{0, 0}, {72704, 768}} 框架的 Container UIView
  • 创建一个框架为 {{0, 0}, {1024, 768}} 的 UIScrollView
  • 将 ScrollView 添加到 ScrollViewController 视图中
  • 将容器添加到 ScrollView
  • 创建 71 个 UIViewController,框架为 {{0, 0}, {1024, 768}}
  • 将它们添加为 ScrollViewController 的 ChildViewControllers
  • 将他们的子视图添加到容器中
  • 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

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

【问题讨论】:

    标签: objective-c ios uiviewcontroller uiscrollview childviewcontroller


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      哇!这听起来像是对 UIViewController 的完全不必要的使用。没有它你能应付吗?通常的做法是直接将视图添加到滚动视图中,而无需任何干预 UIViewController 包含 foo。

      更直接地解决您的问题:可能涉及自动布局吗? (对于在 Xcode 4.5 中创建的任何新笔尖,默认情况下答案是肯定的。)我没有看到您将 translatesAutoresizingMaskIntoConstraints 设置为 NO,所以如果自动布局发挥作用,它可能正在调整视图大小。当然,我也没有看到你设置任何 autoresizingMask 开头,所以你得到了一个你不负责的默认值。

      【讨论】:

      • 这个问题的根源在于我构建的一个复杂的框架,它可以支持动态构建应用程序。有问题的 71 个 VC 是理论上的容器 VC,可以在必要时加载和卸载其视图。它们可以是任何结构。一切都是在代码中生成的——没有笔尖,但我现在会仔细检查通用的自动生成笔尖。我现在也会尝试 translatesAutoResizingMask!谢谢。
      • 任何地方都没有NIB。在 Scrollview / ContainerView 和 71 个 VC 视图中将“translatesAutoresizingMaskIntoConstraints”设置为 NO。不幸的是,同样的事情。这似乎是一种非常奇怪的行为。
      • 我有同样的问题,我尝试了'translatesAutoresizingMaskIntoConstraints'但不起作用,请帮助
      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2016-01-06
      • 2013-06-07
      相关资源
      最近更新 更多