statusbar - iphone app ioS 7状态栏回iOS 6默认样式?

  显示原文与译文双语对照的内容

在 iOS 7中,UIStatusBar的设计方式与这样的视图合并:

GUI designed by Tina Tavčar

  • 它很酷,但是它有点打乱你视图顶部的一部分,当你有你的观点,并与状态栏就会重叠。

  • 是否有一个简单的解决方案( 例如在 info.plist 中设置属性) 可以改变它的工作方式 [not overlapping] 回到它在iOS6中的样子?

  • 我知道一个更简单的解决方案是让 self.view.center.x + 20点每一个视图控制器,但改变他们将螺丝其他维度( 使用不同的self.view.center.x 会导致问题的自定义继续,等等 ), 突然它变成了单调乏味的工作,最好是要避免的。

  • 如果有人能为我提供one-liner解决方案,我会很高兴。

P.S 。我知道我可以通过像


[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

didFinishLaunchingWithOptions 方法中,但这是一个解决方法,一个避免问题的捷径,所以我不认为这是真正的解决方案。

时间:

在 19上更新 2013年月:

通过添加 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

更正了 NSNotificationCenter 语句中的拼写错误


在 12上更新 2013年月:

已经更正 UIViewControllerBasedStatusBarAppearanceNO

为具有屏幕旋转的应用添加解决方案

添加了更改状态栏背景色的方法。


显然,无法将ios状态栏恢复为它在iOS6中的工作方式。

但是,我们总是可以编写一些代码并将状态栏转换为 iOS6-like,这是我可以提出的最短的方法:

  1. 集合集 UIViewControllerBasedStatusBarAppearanceinfo.plistNO (退出的视图控制器调整状态栏样式,这样我们可以设置状态栏样式使用UIApplicationstatusBarStyle方法。)

  2. 在appdelegate中 application:didFinishLaunchingWithOptions ,叫

    
    if ([[[UIDevice currentDevice] systemVersion] floatValue]> = 7) {
     [application setStatusBarStyle:UIStatusBarStyleLightContent];
     self.window.clipsToBounds =YES;
     self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    
    //Added on 19th Sep 2013
     self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
    }
    return YES;
    
    


为了:

  1. 检查它是否是 iOS 7.

  2. 将栏的状态内容设置为白色,而不是 UIStatusBarStyleDefault 。

  3. 避免subviews的框架超出显示( 用于从顶部进入主视图的视图)的可见边界。

  4. 通过移动和调整应用程序框架的窗口大小,创建状态栏,使状态栏像在 iOS 6中一样占据空间。


对于屏幕旋转的应用,

使用NSNotificationCenter通过添加


[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];

if ([[[UIDevice currentDevice] systemVersion] floatValue]> = 7) 在AppDelegate中创建一个新方法:


- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
 int a = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
 int w = [[UIScreen mainScreen] bounds].size.width;
 int h = [[UIScreen mainScreen] bounds].size.height;
 switch(a){
 case 4:
 self.window.frame = CGRectMake(0,20,w,h);
 break;
 case 3:
 self.window.frame = CGRectMake(-20,0,w-20,h+20);
 break;
 case 2:
 self.window.frame = CGRectMake(0,-20,w,h);
 break;
 case 1:
 self.window.frame = CGRectMake(20,0,w-20,h+20);
 }
}

因此,当方向改变时,它会触发一个 switch 语句来检测应用程序方向( 纵向,上下颠倒,横向或者横向),并分别改变应用程序框架的窗口来创建 iOS 6状态栏。


要更改状态栏的背景色:

添加


 @property (retain, nonatomic) UIWindow *background;

AppDelegate.h 中,使 background 成为类的属性,并防止弧释放它。 ( 如果你不使用 ARC,则不必执行这里操作。)

在这之后,你只需要创建 UIWindow if ([[[UIDevice currentDevice] systemVersion] floatValue]> = 7) :


background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];

后不要忘记 @synthesize background;@implementation AppDelegate

UPDATE(NEW SOLUTION)

这里更新是 iOS 7导航栏的最佳解决方案。problem.You 可以设置导航栏颜色示例: FakeNavBar.backgroundColor = yf_str_lnkusq3pnrxxeidsmvseg33mn5zf2888_yf_str ;

注意:如果你使用默认导航控制器,请使用旧的解决方案。

AppDelegate.m


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

 if([[[UIDevice currentDevice] systemVersion] floatValue]> = 7.0)
 {
 UIView *FakeNavBar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
 FakeNavBar.backgroundColor = [UIColor whiteColor];

 float navBarHeight = 20.0;
 for (UIView *subView in self.window.subviews) {

 if ([subView isKindOfClass:[UIScrollView class]]) {
 subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height - navBarHeight);
 } else {
 subView.frame = CGRectMake(subView.frame.origin.x, subView.frame.origin.y + navBarHeight, subView.frame.size.width, subView.frame.size.height);
 }
 }
 [self.window addSubview:FakeNavBar];
 }

 return YES;

}

旧的解决方案- 如果你使用以前的代码,请忽略以下代码和图像

这是 iOS 7导航栏解决方案的旧版本。

我用下面的代码解决了这个问题。 用于添加状态栏。 didFinishLaunchingWithOptions


if ([[[UIDevice currentDevice] systemVersion] floatValue]> = 7.0) {
 UIView *addStatusBar = [[UIView alloc] init];
 addStatusBar.frame = CGRectMake(0, 0, 320, 20);
 addStatusBar.backgroundColor = [UIColor colorWithRed:0.973 green:0.973 blue:0.973 alpha:1];//change this to match your navigation bar
 [self.window.rootViewController.view addSubview:addStatusBar];
}

对于接口生成器,这是在你使用 iOS 6打开时的,它以 0像素开始。

注意:只有在细节窗格中的"文件检查器"( left-most icon ) 视图控制器取消选中"使用自动版式"时,才会显示 iOS 6/7 增量。

Enter image description here

如果不希望视图控制器被状态栏( 和导航栏) 重叠,请在 Xcode 5中取消选中接口生成器中的"扩展顶部栏上的边"框。

Uncheck the Extend Edges under Top Bars

我已经看过许多教程和许多教程来解决这个该死的问题。 但是他们中没有一个 ! 这是我的解决方案,它适合我:


if( [[[UIDevice currentDevice] systemVersion] floatValue]> = 7.0f ) {
 float statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
 for( UIView *v in [self.view subviews] ) {
 CGRect rect = v.frame;
 rect.origin.y += statusBarHeight;
 v.frame = rect;
 }
}

逻辑很简单。我将 self.view 上的所有子视图转换为 20像素。 就这样了,然后屏幕截图就会像 iOS 6那样显示。 我讨厌ios状态栏 ! ~"~

一个小的替代Archy的回答,更简单一点:

a 。设置


UIViewControllerBasedStatusBarAppearance to NO in info.plist

b 。在 AppDelegate's application:didFinishLaunchingWithOptions: 呼叫:


if ([[UIDevice currentDevice].systemVersion floatValue] <7)
{
 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
else
{
//handling statusBar (iOS7)
 application.statusBarStyle = UIStatusBarStyleLightContent;
 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
 self.window.clipsToBounds = YES;

//handling screen rotations for statusBar (iOS7)
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientationNotification:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
}

并添加该方法:


- (void)applicationDidChangeStatusBarOrientationNotification:(NSNotification *)notification
{
//handling statusBar (iOS7)
 self.window.frame = [UIScreen mainScreen].applicationFrame;
}

你也可以考虑子类化 UIWindow 来处理 UIApplicationDidChangeStatusBarOrientationNotification 自身本身。

我在所有的视图控制器中都使用了这个,它很简单。 在所有viewDidLoad方法中添加这一行:


- (void)viewDidLoad{
//add this 2 lines:
 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
 self.edgesForExtendedLayout = UIRectEdgeNone;

 [super viewDidLoad];
}

...