我遇到了ChildViewController视图的问题,他们的框架会自动更改为父框架。我把它提炼成一个带有单个类的示例项目来说明发生了什么。
简而言之,我:
所有自动调整遮罩/自动调整子视图设置为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));
}
}
答案 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中