我有一个基于导航的应用程序,用户可以在其中隐藏状态栏。在默认设置中会记住这一点。
它主要起作用,但有一个例外:如果应用程序被加载(从零开始,返回到主屏幕后不返回),那么状态栏应该是可见的,当它切换到不可见时,导航条不会向上移动以填充屏幕。切换设置后,导航栏上下移动正确,但仍然与额外的状态栏大小的差距之间的导航栏,或屏幕顶部,或状态栏。如果我返回主屏幕并重新输入应用程序,这将自我纠正。因此,我假设在返回到应用程序时,会在uinavigationcontroller上调用某种方法,在切换状态栏之后需要调用该方法?
我尝试过(我认为)所有的任意完全屏幕布局属性的组合,我是在下面的方法中设置它,但是它没有什么区别,所以我最终在nib中将它(在导航控制器上)设置为no。
下面是切换状态栏的代码。它位于我的应用程序委托中,它的导航控制器和窗口按照模板应用程序设置为出口。
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];
}发布于 2011-08-11 10:37:05
问题在于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];
}发布于 2011-07-29 09:02:58
窗口总是低于状态栏,所以您不应该试图调整它的大小。
相反,将窗口根视图控制器的视图调整为[[UIScreen mainScreen] applicationFrame]。
发布于 2011-07-29 08:33:05
据我所知,如果您隐藏状态栏,您的视图将自动占据新的空间,您不必手动更改窗口框。如果你试着做这个会怎么样?
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
}https://stackoverflow.com/questions/6870489
复制相似问题