如何在设备方向更改之前确定UINavigationBar大小

时间:2015-03-21 07:33:43

标签: ios uinavigationbar device-orientation

我正在使用Xcode 6和iOS 8在Objective-C中编写应用程序。该应用程序需要能够部署在iPhone 5,6或6 +上。

如果您想直接回答我的问题,请跳到最后一句话。如果你想了解我为什么会有这样的问题,或者我可以改变我的UI布局以便以另一种方式解决我的问题,请继续阅读。

在我的一个视图控制器中,我有一个滚动视图,其顶部约束在导航栏的底部,其底部约束在表视图的顶部。表格视图的底部被限制在视图控制器主视图的底部(即手机底部)。

滚动视图包含用户点击它们时展开/收缩的子视图。我希望滚动视图随着子视图的增长而增长,但显然我不希望滚动视图在屏幕上生长,因为它看起来很糟糕,因为它会导致不可满足的约束(表格视图的顶部 - 它被限制在滚动视图的底部 - 将在其底部下方交叉 - 这被约束到主视图的底部......这会导致错误)。因此,我使用以下代码使滚动视图根据其子视图大小自行调整大小,而不会在屏幕上显示:

// The max height before the scroll view would go off screen, which would 
// mess up the table view's constraints and cause all sorts of problems
CGFloat maxHeight = self.view.size.height
                  - self.navigationController.navigationBar.frame.size.height
                  - [UIApplication sharedApplication].statusBarFrame.size.height;

// The height of all the subviews in the scroll view.
CGFloat height = _scrollContentView.frame.size.height;

if (height > maxHeight) {
    height = maxHeight;
}

self.scrollViewHeightConstraint.constant = height;

现在为有趣的部分。最初,每当我将设备从纵向旋转到横向时,我都会调用此代码来重新评估和重置滚动视图的大小,反之亦然。但是,当我将手机从纵向旋转到横向时,我遇到了约束错误。我确定这是因为我在旋转后调用此代码,当主视图的高度较小时,但滚动视图的高度仍然很大(导致表格)如我前面所解释的那样,查看最低点到底部等等。所以,我只是将代码移动到之前旋转(我在viewWillTransitionWithSize:withTransitionCoordinator:方法中调用了代码)。到目前为止,这一切都是有道理的。

但是,现在问题是导航条的高度在旋转发生时会发生变化,但viewWillTransitionWithSize:...方法不包含此更改的任何详细信息(它只给出新的大小,主视图将在旋转完成时,而不是导航栏的新尺寸。)

所以,我需要在设备的方向实际发生变化之前确定导航栏的新尺寸(就像我之前可以确定主视图的新尺寸一样)设备的方向实际上使用viewWillTransitionWithSize:...方法更改。

有什么想法吗? TIA!

1 个答案:

答案 0 :(得分:0)

所以,这是我最简单的形式:

/*
 * This method gets called when the device is about to rotate.
 */
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    // Set the scroll view's height to 0 to avoid constraints errors as described
    // in the question.
    self.scrollViewHeightConstraint.constant = 0;
}

/*
 * At the point when this method gets called, the device rotation has finished altering
 * the frames of the views in this view controller, but the layout has not finished
 * so nothing has changed on screen.
 */
- (void)viewWillLayoutSubviews
{
    // The max height before the scroll view would go off screen, which would mess up
    // the table view's constraints and cause all sorts of problems
    CGFloat maxHeight = self.view.size.height
                      - self.navigationController.navigationBar.frame.size.height
                      - [UIApplication sharedApplication].statusBarFrame.size.height;

    // The height of all the subviews in the scroll view.
    CGFloat height = _scrollContentView.frame.size.height;

    if (height > maxHeight) {
        height = maxHeight;
    }

    // Reset the scroll view's height to the appropriate height.
    self.scrollViewHeightConstraint.constant = height;

    [super viewWillLayoutSubviews];
}