10

在视图加载之前setStatusBarHidden:NO设置时,和其他元素会立即在状态栏下方显示为应有的对齐方式。但是,在视图加载设置时,会被部分覆盖。UINavigationBarsetStatusBarHidden:NOUINavigationBar

加载上述视图后必须显示状态栏,但如何在不遇到上述问题的情况下做到这一点?

4

6 回答 6

16

我在我的代码中发现了一个 hack,但不记得或找不到它的来源。诀窍是通过隐藏和重新显示导航栏来刷新它:

[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];
}

但是,请注意,这是一个hack,目前我正在努力解决一些似乎源自此代码的错误(导航项与导航内容不匹配)。但是由于它在某些地方确实对我有用,所以我想我会提到它。

编辑: 我想我在这里找到了最初的帖子: 当隐藏状态栏时,如何让 UINavigationController 中的导航栏更新其位置?

GL,奥德

于 2011-07-26T07:04:47.010 回答
2

(我意识到这是一个老问题,但我只花了半个小时试图自己找到答案,但没有成功,所以我想我会把它贴在这里给任何被卡住的人......特别是如果你想展示状态栏,您的视图最终会重叠)

如果你想隐藏状态栏,我发现这很有效......

[[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];
于 2012-03-28T23:30:24.990 回答
1

我的猜测是在显示状态栏之前正在加载导航栏,因此导航栏的位置是(0,0),然后与(0,0)的状态栏重叠。viewDidLoad调用后,只需在 中移动导航栏的框架(或设置动画块)即可setStatusBarHidden:NO。尝试做navigationBar.frame = CGRectMake(0,20,320,44); 状态栏是 320x20,所以只需将导航栏向下移动 20 就可以适应它。

于 2011-07-06T21:52:31.220 回答
1

如果你遇到这个问题是因为你在Default.png加载时没有显示状态栏,然后想在查看你的第一个视图控制器时立即显示状态栏,只要确保你[[UIApplication sharedApplication] setStatusBarHidden:NO];[self.window makeKeyAndVisible];你的AppDelegate.m. 它发生得如此之快,您将永远不会在初始屏幕上看到状态栏。

[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self.window makeKeyAndVisible];
于 2013-01-08T15:40:32.023 回答
0

在我告诉状态栏进行动画处理后,这就是我现在在 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; }];
于 2012-01-30T23:06:50.690 回答
0

在 iOS 7 中,您可以使用:

setNeedsStatusBarAppearanceUpdate

例如:

[self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate];

苹果文档:

如果视图控制器的状态栏属性(例如隐藏/未隐藏状态或样式)发生更改,则调用此方法。如果您在动画块中调用此方法,则更改将与动画块的其余部分一起进行动画处理。

仅用于 iOS 7。

于 2014-01-10T17:46:15.690 回答