在iOS 7中隐藏状态栏时防止UINavigationController调整原点

Posted

技术标签:

【中文标题】在iOS 7中隐藏状态栏时防止UINavigationController调整原点【英文标题】:Preventing UINavigationController from adjusting origin when status bar is hidden in iOS 7 【发布时间】:2014-02-03 09:14:36 【问题描述】:

我在UITabBar 控制器中有一系列UINavigationControllers。我想隐藏状态栏。但是,当我这样做时,导航栏会自行调整以变短:

Problem Image

我怎样才能防止这种情况并得到如下图所示的东西?

desired outcome

目前我只是使用[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];隐藏状态栏

【问题讨论】:

【参考方案1】:

使用自定义 sizeThatFits 创建自定义 UINavigationBar。

@implementation UINavigationBar (customNavigationBar)
  - (CGSize)sizeThatFits:(CGSize)size 
    CGSize newSize = CGSizeMake(self.frame.size.width,64);
    return newSize;
  
@end

如果有任何疑问请联系我们

【讨论】:

将高度设置为64-[UIApplication sharedApplication].statusBarFrame.size.height 似乎可行,但在更改状态栏时会导致一些卡顿 将高度设置为不在状态栏中的导航栏 不,我明白这一点。但是当状态栏不隐藏时,使用 64 的固定高度会导致 84px 高的导航栏。因此,我们需要减去状态栏的高度以获得一致的 64px 上帝 ios 7 会很烦人 为什么要增加导航栏尺寸【参考方案2】:

您可以在 Storyboard 中创建一个容器视图并设置一个固定的顶部空间(与状态栏相同)。你可以在这个视图中嵌入你的NavigationController

Image 1

Image 2

我希望这会有所帮助。

编辑:添加图片

【讨论】:

你的意思是嵌入UITabBarController吗? 这个,或者特定的 UINavigationController。这取决于您的需求。这只是一个想法,也许有更好的解决方案。 这不能使用 Autolayout 解决吗? 在您的图片中,导航栏的高度仍然为 44px,而不是所需的 64。您只是将 20px 的间隙从底部移到顶部【参考方案3】:

在 appDelegate.m - 创建导航控制器并将其设置为根视图控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
       
       UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];


        HomeViewController *homeViewController = (HomeViewController *)[storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];

        self.navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];

        [self.navigationController setNavigationBarHidden:YES];

        self.window.rootViewController = self.navigationController;

        return YES;

然后,您可以使用 UIImageView + 标签 + 按钮等重新创建导航栏,而不是导航栏... 然后您需要提供正确的自动调整大小掩码,以便 UIImageView 正确调整自身

【讨论】:

【参考方案4】:

这是 codercat 答案的修改版本。隐藏状态栏时,导航栏的origin.y为0。本例中,我设置它的高度为64。当状态栏不隐藏时,保持默认高度44。

@implementation UINavigationBar (customNavigationBar)
- (CGSize)sizeThatFits:(CGSize)size 
    CGPoint originInWindow = [self.window convertPoint:CGPointZero fromView:self];
    CGFloat height = originInWindow.y > 1 ? 44 : 64;
    return CGSizeMake(self.frame.size.width, height);

@end

【讨论】:

以上是关于在iOS 7中隐藏状态栏时防止UINavigationController调整原点的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7隐藏导航栏时如何更改状态栏的颜色?

当隐藏状态栏时,有没有办法防止布局“跳跃”?

在 iOS 7 中使用 Tint Color 显示导航栏时白色状态栏消失

隐藏状态栏时,我的导航栏在 iOS7 中向上移动

隐藏导航栏时隐藏状态栏 - SWIFT iOS8

隐藏状态栏时,iOS 11 搜索栏没有顶部填充