IOS7中的状态栏和导航栏问题

我将我的应用程序迁移到iOS 7.为了处理状态栏问题,我添加了这个代码

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { CGRect frame = self.navigationController.view.frame; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { frame.origin.y = 20; } else { frame.origin.x = 20; } [self.navigationController.view setFrame:frame]; } 

这在正常情况下工作正常。 如果我改变方向(应用程序只支持横向)或提出任何视图控制器和解散模型视图控制器我的视图控制器alignment改变。 状态栏再次覆盖我的视图控制器。 这段代码根本不起作用。 请指导我解决这个状态栏的问题。

情况2:这是我如何呈现我的视图控制器

 ZBarReaderViewController *reader = [ZBarReaderViewController new]; reader.readerDelegate = self; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) reader.supportedOrientationsMask = ZBarOrientationMaskLandscape; else reader.supportedOrientationsMask = ZBarOrientationMaskPortrait; [self presentModalViewController:reader animated:YES]; 

参考:

在这里输入图像描述

提前致谢。

修复IOS 7中的状态栏问题

最后,我使用xcode5中的delta值属性修复了状态栏重叠问题。 首先,我已经增加了原来的20pxl所有的控制器在Xib中使用 (它接缝工作正常,只有在IOS 7),之后,我设置所有视图控制器原产 于-δ 的增量值为-20,它工作正常在iOS 6和IOS 7中

步骤做到这一点。

Xcode 5提供了基于操作系统版本的不同视图来查看xib的外观的预览选项。

从助手编辑器中select预览选项

点击助手编辑器

在这里输入图像描述

并select预览选项以预览不同版本的选定视图控制器。 在这里输入图像描述

查看控制器视图预览选项。

在这里输入图像描述

在预览中,您可以find切换选项以预览不同版本的视图。 在预览中,如果通过切换版本不能正确地修复状态栏,可以清楚地看到状态栏的问题。

解决状态栏问题的三个步骤: 第1步:确保视图目标7.0和更高版本在文件检查器中在这里输入图像描述

步骤2:增加视图控制器中添加的所有控件的20个像素 (与状态栏的大小完全相同) 的原点 – y

步骤3:将所有控件的原点y的增量值设置为-20,然后仅根据版本自动调整。 现在使用预览,并感受控件由于增量值而自动调整的差异。 在这里输入图像描述

一旦状态栏问题解决,在呈现模型视图时(ZbarSDK控制器)问题也会自动修复。

预览屏幕:

在这里输入图像描述

我为这个答案迟到了,但我只想分享我所做的,基本上是这样
最简单的解决scheme

首先 – >转到您的info.plist File添加状态栏样式 – >透明黑色风格(0.5的Alpha)

现在,在这里: –

将此代码添加到您的AppDelegate.m中

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Whatever your code goes here if(kDeviceiPad){ //adding status bar for IOS7 ipad if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 1024, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar [self.window.rootViewController.view addSubview:addStatusBar]; } } else{ //adding status bar for IOS7 iphone if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 320, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern [self.window.rootViewController.view addSubview:addStatusBar]; } return YES; } 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; self.window.clipsToBounds =YES; self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); } [self.window makeKeyAndVisible]; return YES; } 

将以下内容设置为info.plist

查看基于控制器的状态栏外观= NO;

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

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

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

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

许多更简单的答案:

将视图的顶部alignment到“顶部布局指南”,但是将控件“顶部布局指南”拖到您的视图并设置“垂直”约束。 看到这个答案的图片参考。

它的工作方式是:“顶部布局指南”将自动调整自己的状态栏是否存在,这一切将工作 – 不需要编码!

PS在这个特定的例子中,通过底部显示的背景也应该通过设置一个适当的垂直约束的视图的底部,它的超视图,或任何其他…

听到我们可以一次做所有的意见

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Notification for the orientaiton change [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; // Window framing changes condition for iOS7 or greater if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730]; [self.window addSubview:statusBarBackgroundView]; self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height); } // Window framing changes condition for iOS7 or greater self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; return YES; } 

而我们正在使用的方向,我们可以添加下面的方法在应用程序委托设置它通过方向。

 - (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView.hidden = YES; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; int width = [[UIScreen mainScreen] bounds].size.width; int height = [[UIScreen mainScreen] bounds].size.height; switch (orientation) { case UIInterfaceOrientationLandscapeLeft: self.window.bounds = CGRectMake(-20,0,width,height); statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height); break; case UIInterfaceOrientationLandscapeRight: self.window.bounds = CGRectMake(20,0,width,height); statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height); break; case UIInterfaceOrientationPortraitUpsideDown: statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20); self.window.bounds = CGRectMake(0, 20, width, height); break; default: statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20); self.window.bounds = CGRectMake(0, -20, width, height); break; } statusBarBackgroundView.hidden = NO; } } 

你应该添加下面的导航控制器类别

。H

 #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> @interface UINavigationController (iOS6fix) @end 

.M

 #import "UINavigationController+iOS6fix.h" @implementation UINavigationController (iOS6fix) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; } @end 

我使用下面的代码解决了这个问题

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(landScape mode) if ([UIDevice currentDevice].systemVersion.floatValue>=7) { CGRect frame = self.window.frame; frame.size.width -= 20.0f; frame.origin.x+= 20.0f; self.window.frame = frame; } if(portrait) if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; CGRect frame = self.window.frame; frame.origin.y += 20.0f; frame.size.height -= 20.0f; self.window.frame = frame; } return YES; } 
 #define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) if (_kisiOS7) { [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")]; } else { [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")]; [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")]; } 

只需在viewWillAppear设置下面的代码。

  if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

使用Salesforce SDK 2.1(Cordova 2.3.0),我们必须执行以下操作,让状态栏显示在应用程序的初始加载中,并从后台(iPhone和iPad)返回:

与此处发布的其他解决scheme相反,这个似乎在设备的旋转中存在。

1- 创build一个SFHybridViewController的类别

 #import "SFHybridViewController+Amalto.h" @implementation SFHybridViewController (Amalto) - (void)viewWillAppear:(BOOL)animated { //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewWillAppear:animated]; } - (void)viewDidLoad { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewDidLoad]; } @end 

2- 添加到AppDelegate.m导入

 #import "SFHybridViewController+Amalto.h" 

3- didFinishLaunchingWithOptions方法的末尾注入

 //Make the status bar appear if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; } 

4- 添加到App-Info.plist属性

View controller-based status bar appearance值为NO View controller-based status bar appearance

有几种不同的方法。 一种方法是使用.plist文件

  • 添加一个新的键“ 查看基于控制器的状态栏外观 ”,并将值设置为“ ”。
  • 添加另一个键“ 最初隐藏状态栏 ”并将值设置为“ ”。

这将隐藏整个项目的状态栏。

截图的方法

UIViewControllerBasedStatusBarAppearance设置为NO您的应用Info.plist应该工作正常