旋转iOS后,子视图控制器高度为零

时间:2014-09-08 19:27:53

标签: ios rotation viewcontroller

我一直在寻找,但找不到我遇到的这个问题的答案。这似乎是相当基础的,所以希望有人可以解释,或指向我以前的帖子。

当将viewcontroller的视图添加为另一个viewcontroller的子视图时,我发现子视图的height属性在旋转时变为零。宽度也趋于增加。

例如,在xib文件中将NSDChildViewController的视图设置为50x100 ...

@implementation ParentViewController

-(void)viewDidLoad
{
  [super viewDidLoad];
  mChild = [[ChildViewController alloc] initWithNibName:nil
                                                  bundle:nil];
  [self.view addSubview:mChild.view];
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [mChild printFrame];
}
@end

@implementation ChildViewController

-(void)printFrame
{
    NSLog(@"%s %@",__FUNCTION__, NSStringFromCGRect(self.view.frame));
}
@end

纵向 - >横向 - >纵向的相应方向的记录如下:

- [ChildViewController printFrame] {{0,0},{50,100}}

- [ChildViewController printFrame] {{0,0},{298,0}}

- [ChildViewController printFrame] {{0,0},{50,248}}

为什么会发生这种情况,我该如何预防呢?目前,在尝试以编程方式将viewcontrollers布局为子视图时,这会给我带来麻烦。到目前为止,我发现的唯一解决方案是使用类似的东西强制将size属性恢复为50x100 ......

-(void)forceSize
{
    CGRect frame = self.view.frame;
    frame.size.width=50;
    frame.size.height=100;
    self.view.frame=frame;
}

但上面看起来很荒谬。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

您的父视图会在其帧更改时自动调整其子视图的大小。在这种情况下,当设备在纵向和横向模式之间切换时,父视图的框架会发生变化。

您似乎正在使用4英寸iPhone设备(或模拟器)进行测试,因此我们正在使用的尺寸为:320 x 568.父视图占用了屏幕的整个宽度和高度。

以下是发生的事情:

从纵向旋转到横向之前:

widthDifference = parentViewWidth - originalChildViewWidth      // 270 (320 - 50)
heightDifference = parentViewHeight - originalChildViewHeight   // 468 (568 - 100)

从纵向旋转到横向后:

childLandscapeViewWidth = parentViewHeight - widthDifference    // 298 (568 - 270)
childLandscapeViewHeight = parentViewWidth - heightDifference   // -148 (320 - 468)
    // (but height cannot be < 0, so this is automatically set to 0)

因此在横向模式下,我们最终得到子视图的宽度= 298和高度= 0

在从横向旋转到纵向之前:

widthDifference = parentViewWidth - childLandscapeViewWidth     // 270 (568 - 298)
heightDifference = parentViewHeight - childLandscapeViewHeight  // 320 (320 - 0)

从横向旋转到纵向后:

childPortraitViewWidth = parentViewWidth - widthDifference      // 50 (320 - 270)
childPortraitViewHeight = parentViewHeight - heightDifference   // 248 (568 - 320)

最终我们得到了子视图的宽度= 50和高度= 248

所以,要阻止父视图(which is YES by default)上的这个疯狂集autoresizesSubviewsNO,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.autoresizesSubviews = NO;
    ...
}