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

Posted

技术标签:

【中文标题】旋转iOS后子视图控制器高度为零【英文标题】:child viewcontroller height zero after rotation iOS 【发布时间】:2014-09-08 19:27:52 【问题描述】:

我一直在搜索,但找不到我遇到的这个问题的答案。这似乎相当基本,所以希望有人能解释一下,或将我指向以前的帖子。

当添加一个视图控制器的视图作为另一个视图控制器的子视图时,我发现子视图的高度属性在旋转时变为零。宽度也趋于增加。

例如,在 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

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

-(void)forceSize

    CGRect frame = self.view.frame;
    frame.size.width=50;
    frame.size.height=100;
    self.view.frame=frame;

但上面的内容似乎很荒谬。任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

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

您似乎在 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) 上的 autoresizesSubviews 设置为 NO,如下所示:

- (void)viewDidLoad

    [super viewDidLoad];
    self.view.autoresizesSubviews = NO;
    ...

【讨论】:

就是这样!感谢您花时间编写清晰的解决方案。一旦我有足够的声誉,我会投票赞成你的回应;) 没问题。同时,您能接受它作为正确答案吗?

以上是关于旋转iOS后子视图控制器高度为零的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 作为 inputAccessoryView 的高度为零

iOS Swift:呈现的视图控制器为零

iOS:Xcode 6 中的 IBOutlet 为零

滚动视图中的内容随着导航菜单的高度值向下移动

iOS 为啥在这种情况下 backBarButtonItem 为零

视图控制器在 iOS 7 中不旋转