我有一个基于导航的应用程序,用户可以隐藏状态栏。这是在默认设置中记住的。
它大部分正常工作,但有一个例外情况:如果应用程序在状态栏可见时被加载(从头开始,而不是返回到主屏幕后),当将其切换为不可见时,导航栏不会上移以填充屏幕。在那之后切换设置可以正确地将导航栏上下移动,但仍然存在额外的状态栏大小间隙,即导航栏和屏幕顶部或状态栏之间。如果我返回到主屏幕并重新进入应用程序,则会自动更正。因此,我认为在返回应用程序时调用了一些针对uinavigationcontroller的方法,我需要在切换状态栏后调用它?
我已经尝试了(我想)所有的wantsfullscreenlayout属性组合,在下面的方法中进行了设置,但没有任何效果,所以我最终在nib中将其(在navigationcontroller上)设置为NO。
以下是切换状态栏的代码。这在我的应用程序委托中,该委托具有按照模板应用程序设置的navigationcontroller和window。
感谢您的帮助。
更新
通过 NSLogging,似乎问题在于 UINavigationBar 的框架。所以我添加了以下代码,它可以工作和动画,但我不是很满意!我觉得这不可能是“正确”的方法。在大多数情况下,额外的代码并没有起到任何作用,因为框架已经在 (0,0) 处,但在某些情况下,它是不正确的,这样做可以得到正确的结果。
它大部分正常工作,但有一个例外情况:如果应用程序在状态栏可见时被加载(从头开始,而不是返回到主屏幕后),当将其切换为不可见时,导航栏不会上移以填充屏幕。在那之后切换设置可以正确地将导航栏上下移动,但仍然存在额外的状态栏大小间隙,即导航栏和屏幕顶部或状态栏之间。如果我返回到主屏幕并重新进入应用程序,则会自动更正。因此,我认为在返回应用程序时调用了一些针对uinavigationcontroller的方法,我需要在切换状态栏后调用它?
我已经尝试了(我想)所有的wantsfullscreenlayout属性组合,在下面的方法中进行了设置,但没有任何效果,所以我最终在nib中将其(在navigationcontroller上)设置为NO。
以下是切换状态栏的代码。这在我的应用程序委托中,该委托具有按照模板应用程序设置的navigationcontroller和window。
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}
感谢您的帮助。
更新
通过 NSLogging,似乎问题在于 UINavigationBar 的框架。所以我添加了以下代码,它可以工作和动画,但我不是很满意!我觉得这不可能是“正确”的方法。在大多数情况下,额外的代码并没有起到任何作用,因为框架已经在 (0,0) 处,但在某些情况下,它是不正确的,这样做可以得到正确的结果。
[navigationController.view setNeedsLayout];
CGRect navBarFrame;
UINavigationBar *navBar = nil;
for (UIView *subView in navigationController.view.subviews)
{
if ([subView isMemberOfClass:[UINavigationBar class]])
{
navBar = (UINavigationBar *)subView;
navBarFrame = navBar.frame;
navBarFrame.origin = CGPointMake(0,0);
break;
}
}
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
[UIView animateWithDuration:0.25 animations:^{
window.frame = [[UIScreen mainScreen] applicationFrame];
navBar.frame = navBarFrame;
}];
}
else
{
window.frame = [[UIScreen mainScreen] applicationFrame];
}