我有一个基于导航的应用程序,用户可以隐藏状态栏。这在默认设置中被记住。
它主要是工作,但有一个例外,即当状态栏应该可见时,如果应用程序被加载(从头开始,在返回到主屏幕后没有返回),当它被切换为不可见时,导航栏不会向上移动以填满屏幕。切换设置后,可以正确地上下移动导航栏,但导航栏和屏幕顶部或状态栏之间仍有额外的状态条大小间隙。如果我返回主屏幕并重新进入应用程序,则会自行更正。因此,我假设在返回到我切换状态栏后需要调用的应用程序时,在uinavigationcontroller上调用了一些方法?
我已经尝试过(我认为)wantfullscreenlayout属性的所有组合,我在下面的方法中设置它但没有区别,所以我最终将它(在导航控制器上)设置为nib中的NO。
以下是切换状态栏的代码。这是在我的应用程序委托中,它根据模板应用程序将navigationcontroller和窗口设置为outlet。
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];
}
答案 0 :(得分:1)
窗口始终位于状态栏的下方,因此您不应尝试调整其大小。
相反,请将窗口根视图控制器的视图调整为[[UIScreen mainScreen] applicationFrame]
。
答案 1 :(得分:1)
问题在于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];
}
答案 2 :(得分:0)
据我所知,如果您隐藏状态栏,您的视图会自动占用新空间,您无需手动更改窗口框架。如果你试试这个
会发生什么if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
[[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
}
答案 3 :(得分:0)
这就是为我解决的问题
只是一个观点:
[self.view setFrame: [self.view bounds]];
内部带滚动视图的视图
[self.view setFrame: [self.view bounds]];
[self.theScroller setFrame: [self.view bounds]];
“theScroller是我的滚动视图的名称