viewWillTransitionToSize和错误的导航栏和状态栏框架高度

问题描述:

我正在尝试为GLKViewController的子类获取可见的绘图区域。在iOS 7中,我将确定方向,然后相应地调整[UIScreen mainScreen] .bounds.size。然后我会减去navigationBar和statusBarFrame高度,瞧! - 我的绘图区域的实际大小。viewWillTransitionToSize和错误的导航栏和状态栏框架高度

现在我试图用viewWillTransitionToSize更新iOS 8,但是当我旋转设备(我有UIInterfaceOrientationMaskAll)时,传递的大小是错误的。实际上,视图的宽度是正确的,但不是高度(涉及导航栏和状态栏高度)。

我见过几个关于SO的问题,但没有涉及到这个问题,至少没有什么能帮助我。

这似乎并没有对我做任何事情有趣,纠正我,如果我错了:

- (void)viewWillTransitionToSize : (CGSize) size 
     withTransitionCoordinator : (id<UIViewControllerTransitionCoordinator>) coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    NSLog(@"size changed : orig(%f,%f) mainScreen(%f,%f)", size.width, size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

    [self updateViews:size]; 
} 

输出,用于转换到景观:

size changed : orig(568.000000,256.000000) mainScreen(320.000000,568.000000) 

其中高度从传递viewWillTransitionToSize看起来是:

320 - (2*32) = 256 

然后下一个旋转到肖像:

size changed : orig(320.000000,536.000000) mainScreen(568.000000,320.000000) 

其中出现从viewWillTransitionToSize传递的高度为:

568 - 32 = 536 

恰好是在横向模式导航栏的高度(如果这意味着什么)。

所以我的问题是:viewWillTransitionToSize如何获得这个大小?它如何考虑根据方向改变大小或消失的额外小节?而最重要的是,为什么它使用这些不正确的高度?

+0

这是我处理与现在同样的问题 - 我得到完全相同的数字作为你得到的时候我的屏幕旋转时,与同差异(32或64分)。对我而言,问题在于我使用'size'参数来获取新视图的高度和宽度,然后使用这些数字来计算子视图的大小。 – Natalia 2015-11-20 01:07:11

在查看视图帧大小viewWillTransitionToSize:withTransitionCoordinationar:时,您可能会在更新之前获取帧。这个方法里面

更好地利用animateAlongsideTransition:completion:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 


    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
      //update views here, e.g. calculate your view 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+0

是的 - 非常感谢!我仍然不太明白viewWillTransitionToSize如何工作。为什么我会在更新之前获取帧,当参数中指示的大小是过渡到的大小时?我错过了明显的东西吗?过渡后的大小绝对不是一个旧框架,但它也不是正确的框架。 – dragonflyesque 2015-03-25 01:24:04

+0

我遇到了和你描述的完全相同的问题。奇怪的是:当设备从风景右转到左风景时,提供了正确的框架。只有从风景转换为人像时才会出现问题,反之亦然。 – Tuslareb 2015-06-05 21:30:04

+4

这是因为在纵向和横向之间旋转(反之亦然)时,条的新高度尚未包含在viewWillTransitionToSize的大小参数中。但左侧风景右侧和左侧风景使用相同的导航栏和工具栏高度,因此在这种情况下,无需等待这些栏已调整大小。 Objective C充满了这种棘手的业务,您需要使用完成块或调度功能来获得正确的时序。远非平凡,容易忽略。 – marcelnijman 2015-06-19 11:02:09