【问题标题】:viewWillTransitionToSize and wrong navigationBar and statusBarFrame heightsviewWillTransitionToSize 和错误的 navigationBar 和 statusBarFrame 高度
【发布时间】:2015-03-24 21:08:04
【问题描述】:

我正在尝试获取 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];
}

转换为横向的输出:

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

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

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

【问题讨论】:

  • 这是我现在正在处理的同一个问题 - 当我的屏幕旋转时,我得到的数字与你得到的完全相同,具有相同的差异(32 或 64 点)。对我来说问题是我正在使用“大小”参数来获取新的视图高度和宽度,然后使用这些数字来计算子视图大小。

标签: ios objective-c viewwilltransitiontosize


【解决方案1】:

查看视图帧大小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)
     {
     }];
}

【讨论】:

  • 是的 - 非常感谢,效果很好!我仍然不太明白 viewWillTransitionToSize 是如何工作的。当参数中指示的大小是要转换到的大小时,为什么我会从更新之前获取帧?我错过了一些明显的东西吗?转场后的尺寸绝对不是旧帧,但也不是正确的帧。
  • 我遇到了与您描述的完全相同的问题。奇怪的是:当设备从横向向右旋转到横向向左时,提供了正确的框架。仅当从横向转换为纵向时才会出现此问题,反之亦然。
  • 这是因为当在纵向和横向(或反之)之间旋转时,条的新高度尚未包含在 viewWillTransitionToSize 的尺寸参数中。但是横向右侧和横向左侧使用相同的导航栏和工具栏高度,因此在这种情况下无需等到这些栏已调整大小。 Objective C 充满了如此棘手的业务,您需要使用完成块或调度函数来获得正确的时间。远非微不足道,而且容易被忽视。
  • 谢谢您,在找到您的答案之前,我一直遇到边界不正确的问题!
猜你喜欢
  • 2019-07-08
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多