setStatusBarHidden:否之后XIB负载覆盖UINavigationBar的
当setStatusBarHidden:NO
设置之前视图负载,UINavigationBar
和其他元素立即出现状态条下方对齐,他们应该。但是,当setStatusBarHidden:NO
设置为后视图加载,UINavigationBar
部分覆盖。setStatusBarHidden:否之后XIB负载覆盖UINavigationBar的
加载所述视图后必须显示StatusBar,但如何在不遇到上述问题的情况下完成此操作?
我在我的代码中发现了一个黑客,虽然不记得或找到它来自哪里。诀窍是通过隐藏和reshowing以刷新导航栏:
[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];
}
然而,被警告,这是一个黑客,目前我正在努力解决一些似乎源于此代码的错误(导航条目与导航内容不匹配)。但是因为它在某些地方对我有用,所以我想我会提及它。
编辑: 我想我找到了最初的帖子在这里: How do I get the navigation bar in a UINavigationController to update its position when the status bar is hidden?
GL, 俄德
这用于工作,但它看起来像不在iOS 5上。:( – davehayden 2012-01-30 22:27:24
我的猜测是导航栏在状态栏显示之前加载,因此导航栏的位置是(0,0),然后与(0,0)处的状态栏重叠。在致电setStatusBarHidden:NO
后,您可以移动导航栏的框架(或设置动画块)viewDidLoad
。 尝试做navigationBar.frame = CGRectMake(0,20,320,44);
状态栏是320x20,所以只需将导航栏向下移动20就应该适应它。
下面是我在做什么在我的根控制器现在在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; }];
(我知道这是一个老问题,但我只花了一个半小时试图找到自己的答案没有成功,所以我想我会在这里发布了其他人谁卡住...特别是如果你想显示状态栏,你的观点是结束了重叠的话)
我发现这个作品,如果你想隐藏状态栏...
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.view setFrame: [[UIScreen mainScreen] bounds]];
但不是当你想显示状态栏... 在这种情况下我使用这个解决方案wh ich工作,但我很担心,因为它将状态栏高度硬编码为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];
如果你是因为你不显示状态栏,而你Default.png
加载,然后想在观看你的第一个视图控制器立即显示在状态栏有这个问题,只要确保你之前把[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self.window makeKeyAndVisible];
在您的AppDelegate.m
。它发生得非常快,你永远不会看到启动画面上的状态栏。
[[UIApplication sharedApplication] setStatusBarHidden:NO];
[self.window makeKeyAndVisible];
这适用于我,只需确保在AppDelegate中的[self.window makeKeyAndVisiable]之前插入set statusBarHidden:withAnimation:方法即可。 – 2013-03-06 07:08:14
在搭载iOS 7,您可以使用:
setNeedsStatusBarAppearanceUpdate
例如:
[self.mainViewController.navigationController setNeedsStatusBarAppearanceUpdate];
苹果文档:
调用此方法如果视图控制器的状态栏属性,如 为隐藏/未隐藏状态o风格,变化。如果您在动画块内调用此方法 ,则动画块的其余部分将与动画一起动画。
仅使用它的iOS 7
我很想知道这个问题的答案为好。 – 2011-06-24 17:48:05