viewWillTransitionToSize和错误的navigationBar和statusBarFrame高度

dra*_*que 6 objective-c ios viewwilltransitiontosize

我试图获得GLKViewController的子类的可见绘图区域.在iOS 7中,我将确定方向,然后相应地调整[UIScreen mainScreen] .bounds.size.然后我会减去navigationBar和statusBarFrame的高度,瞧! - 我绘图区域的实际大小.

现在我正在尝试使用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];
}
Run Code Online (Sandbox Code Playgroud)

过渡到景观的输出:

size changed : orig(568.000000,256.000000) mainScreen(320.000000,568.000000)
Run Code Online (Sandbox Code Playgroud)

从viewWillTransitionToSize传递的高度似乎是:

320 - (2*32) = 256
Run Code Online (Sandbox Code Playgroud)

然后下一轮旋转到肖像:

size changed : orig(320.000000,536.000000) mainScreen(568.000000,320.000000)
Run Code Online (Sandbox Code Playgroud)

从viewWillTransitionToSize传递的高度似乎是:

568 - 32 = 536
Run Code Online (Sandbox Code Playgroud)

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

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

tub*_*tub 12

查看视图帧大小时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)
     {
     }];
}
Run Code Online (Sandbox Code Playgroud)

  • 这是因为当纵向和横向之间的旋转(反之亦然)时,条形的新高度尚未包含在viewWillTransitionToSize的尺寸参数中.但是横向右侧和横向左侧使用相同的导航栏和工具栏高度,因此在这种情况下,无需等到这些条形图调整大小.目标C充满了这种棘手的业务,你需要使用完成块或调度函数来获得正确的时机.远非琐碎,容易被忽视. (5认同)