首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏UIStatusBar /移动UINavigationBar

隐藏UIStatusBar /移动UINavigationBar
EN

Stack Overflow用户
提问于 2011-07-29 08:25:56
回答 4查看 4.9K关注 0票数 3

我有一个基于导航的应用程序,用户可以在其中隐藏状态栏。在默认设置中会记住这一点。

它主要起作用,但有一个例外:如果应用程序被加载(从零开始,返回到主屏幕后不返回),那么状态栏应该是可见的,当它切换到不可见时,导航条不会向上移动以填充屏幕。切换设置后,导航栏上下移动正确,但仍然与额外的状态栏大小的差距之间的导航栏,或屏幕顶部,或状态栏。如果我返回主屏幕并重新输入应用程序,这将自我纠正。因此,我假设在返回到应用程序时,会在uinavigationcontroller上调用某种方法,在切换状态栏之后需要调用该方法?

我尝试过(我认为)所有的任意完全屏幕布局属性的组合,我是在下面的方法中设置它,但是它没有什么区别,所以我最终在nib中将它(在导航控制器上)设置为no。

下面是切换状态栏的代码。它位于我的应用程序委托中,它的导航控制器和窗口按照模板应用程序设置为出口。

代码语言:javascript
复制
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),但是在一个不正确的情况下,这会给出正确的结果。

代码语言:javascript
复制
[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];
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-11 10:37:05

问题在于UINavigationBar的框架。所以我增加了下面的代码,它的工作和动画,但我不满意!我不认为这样做是“正确的”方式。在大多数情况下,额外的代码什么也不做,因为框架已经在(0,0),但是在一个不正确的情况下,这会给出正确的结果。

代码语言:javascript
复制
[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];
}
票数 1
EN

Stack Overflow用户

发布于 2011-07-29 09:02:58

窗口总是低于状态栏,所以您不应该试图调整它的大小。

相反,将窗口根视图控制器的视图调整为[[UIScreen mainScreen] applicationFrame]

票数 1
EN

Stack Overflow用户

发布于 2011-07-29 08:33:05

据我所知,如果您隐藏状态栏,您的视图将自动占据新的空间,您不必手动更改窗口框。如果你试着做这个会怎么样?

代码语言:javascript
复制
if ([UIApplication sharedApplication].statusBarHidden != hideStatusBar)
{
    [[UIApplication sharedApplication] setStatusBarHidden:hideStatusBar withAnimation:UIStatusBarAnimationSlide];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6870489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档