添加状态栏后导航栏无法重新定位

时间:2013-02-08 13:21:50

标签: ios ios6 uinavigationbar statusbar

我有一个似乎在iOS6中出现的导航栏定位问题 它在许多方面起作用,类似于一些用户在旋转某些视图时遇到的问题

该应用有一个闪屏,全屏显示(通过将Hide statusbar during application launch设置为True来实现)

然后在我的主视图控制器的viewDidLoad中,以下行将状态栏添加回应用程序:

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

这会将StatusBar添加到应用程序,并按预期将视图向下移动20pt。 但是,NavigationBar保持在StatusBar下方,下面有20pt的毛刺。

The glitch created by adding statusBar

在iOS6之前我曾经通过添加以下代码来解决这个问题:

[UIApplication sharedApplication].keyWindow.frame=CGRectMake(0, 20, 320, [[UIScreen mainScreen] bounds].size.height-20);

然而,现在,这不起作用。

一些研究显示,在致电viewDidLoad时,keyWindow.frame的大小和来源均为{0,0},并且更改它无效。

将上述两行插入viewDidAppear时,我会在应用启动时获得相同的行为。然而,当我移动到另一个视图并返回到第一个视图时,keyWindow.frame的更改具有所需的效果,并且NavigationBar最终定位在它应该的位置。

我的问题是:当StatusBar最初被隐藏时,如何在将StatusBar添加到iOS应用程序后使NavigationBar获得正确的位置?

2 个答案:

答案 0 :(得分:1)

调用setStatusBarHidden:在viewWillAppear上为NO。

答案 1 :(得分:1)

好像我再次上班了

在其他方法(view[Will|Did]Appear)中执行操作的效果不适用,因为状态栏已由viewDidLoad的调用显示。我确实从那里删除了代码,然后从viewDidAppear获得了所需的效果。前面调用的任何方法都不会改变子框架。 (viewDidLoadviewWillAppear都不会改变[UIApplication sharedApplication].keyWindow.frame)的框架

所以这必须在viewDidAppear中完成。只需确保状态栏尚未显示在之前调用的某些方法中......

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:NO];
    [UIApplication sharedApplication].keyWindow.frame=CGRectMake(0, 20, 320, [[UIScreen mainScreen] bounds].size.height-20);
}