setStatusBarHidden:在XIB加载覆盖UINavigationBar之后为NO

在视图加载之前设置
setStatusBarHidden:NO
时,
UINavigationBar
和其他元素在StatusBar正下方显示为对齐。但是,在视图加载后设置
setStatusBarHidden:NO
时,部分覆盖
UINavigationBar
。 加载所述视图后必须显示StatusBar,但如何在不遇到上述问题的情况下完成此操作?     
已邀请:
我在我的代码中找到了一个黑客,虽然不记得或找不到它的来源。诀窍是通过隐藏和重新显示它来刷新导航栏:
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.navigationController setNavigationBarHidden:NO animated:NO];
在我的代码中,函数看起来像这样:
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];

    [self.navigationController setNavigationBarHidden:YES animated:NO];
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}
但是,请注意,这是一个黑客,目前我正在努力解决一些似乎来自此代码的错误(导航项目与导航内容不匹配)。但是因为它在某些地方对我有用,我想我会提到它。 编辑: 我想我在这里找到了最初的帖子: 当隐藏状态栏时,如何让UINavigationController中的导航栏更新其位置? GL, 俄德     
(我意识到这是一个古老的问题,但我只花了半个小时试图找到自己没有成功的答案,所以我想我会把它贴在这里给其他任何被卡住的人...特别是如果你想要显示状态栏和您的视图最终重叠它) 如果你想隐藏状态栏,我发现这个有效...
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.view setFrame: [[UIScreen mainScreen] bounds]];
但是当你想要显示状态栏时... 在这种情况下,我使用这个有效的解决方案,但我担心,因为硬编码状态栏高度为20 ... 它也让我担心我必须根据方向不同地调整视图。但如果我不这样做,它总是在错误的边缘有20点的差距。 在我的情况下,我想关闭某些视图的状态栏,然后在我返回时重新打开状态栏。如果我在酒吧关闭时旋转设备,我会遇到特殊问题。所以switch语句,虽然丑陋(有人可能发布一个更清洁的解决方案),但是有效。
[[UIApplication sharedApplication] setStatusBarHidden:NO];

CGRect frame = [[UIScreen mainScreen] bounds];

switch (self.interfaceOrientation) 
{
    case UIInterfaceOrientationPortrait:
        frame.origin.y = 20;
        frame.size.height -= 20;
        break;

    case UIInterfaceOrientationPortraitUpsideDown:
        frame.origin.y = 0;
        frame.size.height -= 20;
        break;

    case UIInterfaceOrientationLandscapeLeft:
        frame.origin.x = 20;
        frame.size.width -= 20;
        break;

    case UIInterfaceOrientationLandscapeRight:
        frame.origin.x = 0;
        frame.size.width -= 20;
        break;

} 

[self.view setFrame:frame];
    
我的猜测是在显示状态栏之前正在加载导航栏,因此导航栏的位置为(0,0),然后与(0,0)处的状态栏重叠。在调用
setStatusBarHidden:NO
后,您可以在
viewDidLoad
中移动导航栏的框架(或设置动画块)。 试着做
navigationBar.frame = CGRectMake(0,20,320,44);
状态栏为320x20,因此只需将导航栏向下移动20即可。     
如果您遇到此问题是因为在加载
Default.png
时没有显示状态栏,然后想要在查看第一个View Controller时立即显示状态栏,请确保在
AppDelegate.m
中将
[[UIApplication sharedApplication] setStatusBarHidden:NO];
放在
[self.window makeKeyAndVisible];
之前。它发生得如此之快,你永远不会在启动画面上看到状态栏。
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self.window makeKeyAndVisible];
    
在我告诉状态栏动画之后,这就是我现在在iOS 5中的根管理器中正在做的事情。丑陋,但似乎有效。
CGRect rect;

if ( self.interfaceOrientation == UIInterfaceOrientationPortrait )
    rect = CGRectMake(0, 20, 320, 460);
else if ( self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown )
    rect = CGRectMake(0, 0, 320, 460);
else if ( self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft )
    rect = CGRectMake(20, 0, 300, 480);
else
    rect = CGRectMake(0, 0, 300, 480);

[UIView animateWithDuration:0.35 animations:^{ self.view.frame = rect; }];
    
在iOS 7中,您可以使用:
setNeedsStatusBarAppearanceUpdate
例如:
[self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate];
苹果文档:   如果视图控制器的状态栏属性,请调用此方法   作为隐藏/未隐藏的状态或风格,改变。如果你调用这个方法   在动画块中,更改与动画一起动画   其余的动画块。 仅用于iOS 7。     

要回复问题请先登录注册