我正在将我的应用程序迁移到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];
}
这在正常情况下工作正常。如果我正在更改方向(应用程序仅支持横向方向)或呈现任何视图控制器并关闭模型视图控制器,我的视图控制器对齐方式已更改。状态栏再次与我的视图控制器重叠。这段代码根本不起作用。请指导我修复此状态栏问题。
案例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];
价:
提前致谢。
答案 0 :(得分:132)
修复了IOS 7中的状态栏问题
最后,我使用xcode5中的delta值属性修复了状态栏。首先,我有增加的起源 - 对于Xib中使用的所有控制器来说是20pxl (它的接缝仅在IOS 7中正常工作),之后我为所有视图设置delta值控制器原点-y到-20它在ios 6和IOS 7中都能正常工作。
这样做的步骤。
Xcode 5提供预览选项,可根据操作系统版本查看不同视图中xib的外观。
从助理编辑器中选择预览选项
点击助理编辑器
并选择预览选项以预览不同版本的所选视图控制器。
查看控制器视图预览选项。
在预览中,您可以找到切换选项以预览不同版本的视图。在预览中,如果通过切换版本未正确修复状态栏,则可以清楚地感觉到状态栏问题。
修复状态栏问题的三个步骤: 第1步:确保视图定位到7.0及更高版本的文件检查器。
步骤2:为视图控制器中添加的所有控件增加原点y,其中包含20像素(正好是状态栏的大小)。
步骤3:将所有控件的原点y的增量值设置为-20 然后仅根据版本自动调整。现在使用预览,并感受控件因delta值而自动调整的差异。
状态栏问题解决后,在显示模型视图(ZbarSDk控制器)时发出的问题也会自动修复。
预览屏幕:
答案 1 :(得分:15)
我对这个答案迟到了,但我只想分享我的所作所为,这基本上是为了 最简单的解决方案
所有的 第一次 - >转到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;
}
答案 2 :(得分:6)
- (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;
答案 3 :(得分:3)
听到我们可以立即为所有观点执行此操作
- (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;
}
虽然我们正在使用方向,但我们可以在app delegate中添加以下方法,以便通过方向设置它。
- (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
答案 4 :(得分:3)
要在ios7中隐藏状态栏,请按照以下简单步骤操作:
在Xcode中转到“Resources
”文件夹并打开“(app name)-Info.plist file
”。
View controller based status bar appearance
”键并设置其值“NO
”Status bar is initially hidden
”键并设置其值“YES
”如果没有按键,则可以在顶部选择“information property list
”进行添加,然后点击 + 图标
答案 5 :(得分:3)
很多更简单的答案:
将视图顶部与“顶部布局指南”对齐,但控制拖动“顶部布局指南”到视图并设置“垂直”约束。 See this answer用于图片参考。
它的工作方式是 - “顶部布局指南”将自动调整状态栏,当状态栏存在或不存在时,它将全部工作 - 无需编码!
P.S。在这个特定的示例中,底部显示的背景也应该通过设置视图底部,它的超视图或其他任何内容的适当垂直约束来解决...
答案 6 :(得分:1)
我通过使用以下代码解决了这个问题
- (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;
}
答案 7 :(得分:1)
#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")];
}
答案 8 :(得分:1)
只需在viewWillAppear
中设置以下代码即可。
if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
答案 9 :(得分:0)
使用Salesforce SDK 2.1(Cordova 2.3.0),我们必须执行以下操作,以便在应用程序的初始加载状态下显示状态栏并从后台(iPhone和iPad)返回:
与此处发布的其他解决方案相反,这个解决方案似乎可以在设备旋转后继续存在。
1- 创建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
的方法AppDelegate
末尾注入
//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
答案 10 :(得分:0)
有几种不同的方式。一种方法是使用.plist文件
这将隐藏整个项目的状态栏。