iOS 7-状态栏与视图重叠




statusbar ios7 (10)

我有一个ViewControllerUINavigationcontroller ,但导航条被隐藏。 当我在iOS 7上运行应用程序时,状态栏显示在我的视图之上。 有没有办法避免这种情况?

我不想编写任何操作系统特定的代码。

我试图将View controller-based status bar appearanceNO ,但它没有解决问题。


Xcode 5拥有专门用于解决此问题的iOS 6/7 Deltas 。 在故事板中,我将视角向下移动20像素以在iOS 7上正确显示,为了使它与iOS 6兼容,我将Delta y更改为-20。

由于我的故事板没有使用自动布局,为了在iOS 6上正确调整视图的高度,我必须设置Delta height以及Delta Y


只有我自己制定的工作解决方案。

这是我的UIViewController子类https://github.com/comonitos/ios7_overlaping

1来自UIViewController的子类

2从你的类window.rootViewController子类。

3瞧!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4添加这个使你的状态栏变成白色就在[self.window makeKeyAndVisible]之后; !

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

如果你想完全隐藏它,只是避免处理它,这很好。

-(BOOL) prefersStatusBarHidden
{
    return YES;
}

参考https://.com/a/18873777/1030449


如果你根本不需要任何状态栏,则需要用这些数据更新你的plist:为此,在plist中添加以下2个设置:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

在iOS 7中,您需要考虑重叠透明的状态栏来设计您的应用程序。 例如,查看新的iOS 7天气应用程序。


如果您希望以任何代价启用“使用Autolayout”,请将以下代码放在viewdidload中。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

对于导航栏:

编写此代码:

self.navigationController.navigationBar.translucent = NO;

只是为我做了诡计。


文森特的答案edgesForExtendedLayout为我工作。

这些宏有助于确定操作系统版本,使其更容易

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

将这些宏添加到项目的prefix.pch文件中,并可以在任何地方访问

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}

要在ios7中隐藏状态栏,请执行以下简单步骤:

在Xcode转到“ Resources ”文件夹并打开“ (app name)-Info.plist file ”。

  • 检查“ View controller based status bar appearance ”键并将其值设置为“ NO
  • 检查“ Status bar is initially hidden ”键并将其值设置为“ YES

如果密钥不存在,则可以通过选择顶部的“ information property list ”来添加它,然后单击+图标


这是删除状态栏所需的全部内容。


-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

在plist中添加密钥---查看基于控制器的状态栏外观:NO





ios7