在视图加载之前setStatusBarHidden:NO
设置时,和其他元素会立即在状态栏下方显示为应有的对齐方式。但是,在视图加载后设置时,会被部分覆盖。UINavigationBar
setStatusBarHidden:NO
UINavigationBar
加载上述视图后必须显示状态栏,但如何在不遇到上述问题的情况下做到这一点?
在视图加载之前setStatusBarHidden:NO
设置时,和其他元素会立即在状态栏下方显示为应有的对齐方式。但是,在视图加载后设置时,会被部分覆盖。UINavigationBar
setStatusBarHidden:NO
UINavigationBar
加载上述视图后必须显示状态栏,但如何在不遇到上述问题的情况下做到这一点?
我在我的代码中发现了一个 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,奥德
(我意识到这是一个老问题,但我只花了半个小时试图自己找到答案,但没有成功,所以我想我会把它贴在这里给任何被卡住的人......特别是如果你想展示状态栏,您的视图最终会重叠)
如果你想隐藏状态栏,我发现这很有效......
[[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)的状态栏重叠。viewDidLoad
调用后,只需在 中移动导航栏的框架(或设置动画块)即可setStatusBarHidden:NO
。尝试做navigationBar.frame = CGRectMake(0,20,320,44);
状态栏是 320x20,所以只需将导航栏向下移动 20 就可以适应它。
如果你遇到这个问题是因为你在Default.png
加载时没有显示状态栏,然后想在查看你的第一个视图控制器时立即显示状态栏,只要确保你[[UIApplication sharedApplication] setStatusBarHidden:NO];
在[self.window makeKeyAndVisible];
你的AppDelegate.m
. 它发生得如此之快,您将永远不会在初始屏幕上看到状态栏。
[[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。