我遇到的问题是状态栏被隐藏然后重新出现 - 这样做会改变导航栏的位置,使其不会显示在状态栏下方,而是显示在其后面。即不再能看到导航栏的顶部,因为状态栏位于其上方。
我的程序是这样构建的,我有一个根视图控制器,显示状态栏和导航栏,视图控制器包含在导航控制器中,即
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.myTableViewController];
self.window.rootViewController = navController;
视图控制器包含一个表视图,如果用户选择一行,则创建另一个控制器并将其推送到导航控制器的堆栈。
这个新的视图控制器会隐藏状态栏并隐藏导航栏,除非用户点击屏幕,在这种情况下会出现导航栏(并且它也是半透明的,它不在父视图控制器中)。 p>
我的问题是,当用户从此视图控制器导航回表视图控制器时,导航栏现在显示在状态栏后面。
我在表视图的viewWillAppear中有以下代码:我认为应该将所有内容重置为原来的样式。
- (void)viewWillAppear:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden: NO withAnimation: UIStatusBarAnimationFade];
self.navigationController.navigationBar.translucent = NO;
[self.navigationController setNavigationBarHidden:NO animated:YES];
为了重新显示表格视图,为什么导航栏会显示在状态栏后面?
由于
答案 0 :(得分:3)
我相信状态栏大约是20px高,所以将navigationBar的origin.y设置为20,它应该修复它。我知道这很烦人,但这似乎是根据我的经验修复它的唯一方法。
当你的应用程序退出后台状态时,还要检查navigationBar的位置,我知道我的导航栏在到达前台时会立即恢复到状态栏下。
答案 1 :(得分:0)
我遇到了同样的问题,在堆栈溢出和测试上尝试了很多goole之后,找到了解决问题的方法。我认为问题是由于视图的边界发生了变化(例如,当你隐藏状态栏时,视图的边界会发生变化)
(在我的项目中,不仅隐藏了状态栏,还隐藏了导航控制器的导航栏。)
需要以下代码:
- (id)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:UIApplicationWillEnterForegroundNotification object:nil];
}
return self;
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)test
{
// the point is UIApplicationWillEnterForegroundNotification notification process
// function should be called before all view controller delegate function being
// called, then we make all status bar and navigation bar show to restore the view's
// bounds, view contrller's view's bound should correct, then hide will not shift up
[self showStatusBarAndNaviBar];
[self performSelector:@selector(hideStatusBarAndNaviBar) withObject:self afterDelay:1.0];
}
//two custom function for use
- (void)hideStatusBarAndNaviBar
{
[UIView animateWithDuration:2.0f
delay:0.0f
options:UIViewAnimationOptionAllowUserInteraction
animations:^(void) {
self.navigationController.navigationBar.alpha = 0.0f;
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
completion:^(BOOL finished){}];
}
- (void)showStatusBarAndNaviBar
{
[UIView animateWithDuration:1.0f
delay:0.0f
options:UIViewAnimationOptionAllowUserInteraction
animations:^(void) {
self.navigationController.navigationBar.alpha = 1.0f;
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
completion:^(BOOL finished){}];
}