目标C语言 UIScrollView子视图容器不正确地改变帧



我有一个问题与ChildViewController视图有他们的帧自动更改为他们的父母的帧。我将其浓缩为一个带有单个类的示例项目,以说明发生了什么。

简而言之,我:

  • 有一个ScrollViewController
  • 添加ScrollViewController作为RootViewController并添加到Window
  • 在ScrollViewController - at ViewDidLoad我创建了一个框架为{{0,0},{72704,768}}的容器UIView
  • 创建一个帧为{{0,0},{1024,768}}的UIScrollView
  • 将ScrollView添加到ScrollViewController视图
  • 添加容器到ScrollView
  • 创建71个帧为{{0,0},{1024,768}}的uiviewcontroller
  • 将它们添加为ScrollViewController的ChildViewControllers
  • 将它们的子视图添加到容器
  • 记录所有71帧在ViewDidAppear
  • 每帧{{0,0},{72704,768}}-不是我设置的1024 × 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));
        }
    }

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

创建71个帧为{{0,0},{1024,768}}的uiviewcontroller

哇!这听起来像是完全没有必要使用UIViewController。没有它你能行吗?通常的事情是直接添加视图到滚动视图,没有任何干预UIViewController包含foo.

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

最新更新