IOS 7では、UIStatusBar
は次のようにビューとマージするように設計されています。
(GUIは TinaTavčar によって設計されました)
それはクールですが、あなたがあなたのビューの上部に何かを持っているとき、それはあなたのビューを多少混乱させます、そしてそれはステータスバーと重なります。
それが動作する方法を変更することができる簡単な解決策(info.plistの中でプロパティを設定することなど)は、それがiOS6の中にある方法に戻る(重ならない)か?
私はもっと簡単な解決策はすべての単一のView Controllerに対してself.view.center.x
+ 20ポイントを持つことですが、それらを変えることは他の次元を台無しにし(異なるself.view.center.x
を持つことはカスタムセグエスに問題を引き起こす等)それは避けることが最善です。
誰かが私にこのためのワンライナーソリューションを提供することができれば私は本当に嬉しく思います。
P.S私は私が持っているようなことをすることによってステータスバーを隠すことができることを知っています
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
didFinishLaunchingWithOptions
メソッドでは、これは回避策、問題を回避する近道なので、私はそれを本当の解決策とは考えていません。
これは から書いたブログ投稿 からのクロス投稿ですが、ここではiOS 7のステータスバー、ナビゲーションバー、およびコンテナビューコントローラについて詳しく説明します。
IOS 6スタイルのステータスバーのレイアウトを保持する方法はありません。 iOS 7では、ステータスバーは常にアプリケーションと重なります。
ステータスバーの外観とステータスバーのレイアウトを混同しないでください。外観(明るいまたはデフォルト)は、ステータスバーのレイアウト方法(フレーム/高さ/オーバーラップ)には影響しません。システムステータスバーの背景色が消えていることにも注意してください。 APIがUIStatusBarStyleLightContentを参照するとき、それらは明確な背景の上の白いテキストを意味します。 UIStatusBarStyleDefaultは、明確な背景の上に黒いテキストです。
ステータスバーの外観は、相互に排他的な2つの基本パスのいずれかに沿って制御されます。伝統的な方法でそれらをプログラムで設定するか、またはUIViewControllerの新しいプロパティに基づいてUIKitが外観を更新します。後者のオプションはデフォルトでオンになっています。 「ViewControllerベースのステータスバーの外観」のアプリのplist値を調べて、どれを使用しているかを確認します。この値をYESに設定した場合、アプリ内のすべての最上位のView Controller(標準のUIKitコンテナView Controller以外)は、preferredStatusBarStyleをオーバーライドして、デフォルトまたはライトスタイルを返す必要があります。 plist値をNOに編集した場合は、よく知られているUIApplicationメソッドを使ってステータスバーの外観を管理できます。
UINavigationControllerは、UINavigationBarの高さを44ポイントまたは64ポイントに変更します。これは、かなり奇妙で文書化されていない一連の制約に応じて行われます。 UINavigationControllerが、ビューのフレームの上部がUIWindowの上部と視覚的に隣接していることを検出すると、ナビゲーションバーを64ポイントの高さで描画します。ビューの上端がUIWindowの上端と隣接していない場合(1ポイントだけずれていても)、ナビゲーションバーは「伝統的な」方法で44ポイントの高さで描画されます。 このロジックは、アプリケーションのView Controller階層内のいくつかの子であっても、UINavigationControllerによって実行されます。 この動作を防ぐ方法はありません。
カスタムナビゲーションバーの背景画像の高さがわずか44ポイント(88ピクセル)で、UINavigationControllerのビューの境界が(#4で説明したように)UIWindowの境界と一致する場合、UINavigationControllerはフレームに画像を描画します(0,20,320) 、44)、カスタムイメージの上に20ポイントの不透明な黒いスペースを残します。これはあなたがあなたがルール#1を迂回した賢い開発者であると考えることにあなたを混乱させるかもしれませんが、あなたは間違っています。ナビゲーションバーの高さはまだ64ポイントです。 UINavigationControllerをスライド対表示スタイルのビュー階層に埋め込むことで、これが明確になります。
UIViewControllerの紛らわしい名前のedgesForExtendedLayoutプロパティに注意してください。 edgesForExtendedLayoutを調整してもほとんどの場合何もしません。 UIKitがこのプロパティを使用する唯一の方法は、UINavigationControllerにView Controllerを追加した場合、UINavigationControllerはedgesForExtendedLayoutを使用して、その子View Controllerをナビゲーションバー/ステータスバー領域の下に表示するかどうかを決定することです。 UINavigationController自体にedgesForExtendedLayoutを設定しても、UINavigationControllerに44ポイントまたは64ポイントの高ナビゲーションバー領域があるかどうかは変わりません。その論理については#4を見てください。ツールバーまたはUITabBarControllerを使用している場合、ビューの下部にも同様のレイアウトロジックが適用されます。
UINavigationController内でカスタム子View Controllerがナビゲーションバーをアンダーラップしないようにすることだけを試みる場合は、edgesForExtendedLayoutをUIRectEdgeNone(または少なくともUIRectEdgeTopを除外したマスク)に設定します。 View Controllerのライフサイクルのできるだけ早い段階でこの値を設定してください。
UINavigationControllerとUITabBarControllerは、テーブルビューとコレクションビューのcontentInsetsをそのサブビュー階層に埋め込もうとします。これは、#4からのステータスバーロジックと同様の方法で行われます。これを防ぐには、テーブルビューとコレクションビューに対してautomaticallyAdjustsScrollViewInsetsをNOに設定することでプログラム的に回避する方法があります(デフォルトはYESです)。これはWhisperとRiposteに深刻な問題をもたらしました。ツールバーとキーボードの動きに応じてcontentInset調整を使用してテーブルビューのレイアウトを制御するためです。
繰り返しますが、iOS 6スタイルのステータスバーのレイアウトロジックに戻る方法はありません。これを近似するには、アプリのすべてのView Controllerを、画面上部から20ポイントオフセットされたコンテナビューに移動し、ステータスバーの後ろに意図的に黒いビューを残して古い外観をシミュレートする必要があります。これがRiposteとWhisperで使用した方法です。
#9をやらないようにするために、Appleは非常に懸命に努力しています。彼らは私たちがステータスバーをアンダーラップするように私たちのすべてのアプリを再設計することを望んでいます。ただし、ユーザーエクスペリエンスと技術的な理由の両方から、多くの説得力のある議論があります。なぜなら、これは必ずしも良い考えではないからです。単純にプラットフォームの風変わりに従うのではなく、ユーザーにとって最善のことをするべきです。
2013年9月19日の更新情報
self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
を追加してスケーリングのバグを修正
NSNotificationCenter
ステートメントの誤字を修正しました
2013年9月12日の更新情報
UIViewControllerBasedStatusBarAppearance
をNO
に修正画面を回転させるアプリのためのソリューションを追加しました
ステータスバーの背景色を変更する方法を追加しました。
どうやら、iOS 7のステータスバーをiOS 6での動作に戻す方法はありません。
しかし、私たちはいつでもいくつかのコードを書いてステータスバーをiOS 6のように変えることができます、そしてこれが私が思い付くことができる最も短い方法です:
info.plist
でUIViewControllerBasedStatusBarAppearance
をNO
に設定します(View Controllerにステータスバースタイルを調整させることで、UIApplicationstatusBarStyleメソッドを使用してステータスバースタイルを設定できるようにします)
AppDelegateのapplication:didFinishLaunchingWithOptions
で、呼び出し
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
[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;
のために:
IOS 7かどうか確認してください。
UIStatusBarStyleDefaultではなく、ステータスバーの内容を白に設定します。
表示範囲を超えてフレームが広がるサブビューを表示しないようにします(メインビューに上からアニメーション表示するビューの場合)。
ステータスバーは、iOS 6の場合と同じように、アプリケーションのウィンドウフレームを移動したりサイズ変更したりすることによってスペースを占有するという錯覚を生み出します。
nSNotificationCenterを使用して、追加することで方向の変化を検出します。
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
で、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ステートメントがトリガーされて、アプリの画面の向き(Portrait、Upside Down、Landscape Left、またはLandscape Right)が検出され、アプリのウィンドウフレームがそれぞれ変更されてiOS 6ステータスバーの錯覚が生じます。
追加する
@property (retain, nonatomic) UIWindow *background;
background
をクラスのプロパティにし、ARCが割り当て解除するのを防ぐためにAppDelegate.h
に追加します。 (ARCを使用していない場合は、実行する必要はありません。)
その後はif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
でUIWindowを作成するだけです。
background = [[UIWindow alloc] initWithFrame: CGRectMake(0, 0, self.window.frame.size.width, 20)];
background.backgroundColor =[UIColor redColor];
[background setHidden:NO];
@synthesize background;
の後に@implementation AppDelegate
を忘れないでください!
更新(新しい解決策)
このアップデートは、iOS 7のナビゲーションバーの問題に対する最善の解決策です。ナビゲーションバーの色の例を設定できます。FakeNavBar.backgroundColor = [UIColor redColor];
注:デフォルトのNavigation Controllerを使用している場合は、古い解決方法を使用してください。
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if(NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_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];
}
そして Interface Builder これはあなたがiOS 6で開く時のためのものです。 0ピクセルから始まっています。
解決策:
メソッドをオーバーライドして、あなたのviewcontrollerまたはrootviewcontrollerに設定してください。
-(BOOL) prefersStatusBarHidden
{
return YES;
}
ストーリーボードを多用するプロジェクトに対する別のアプローチは次のとおりです。
目標:
このアプローチの目的は、iOS 7と同じステータスバースタイルをiOS 6と同じように再作成することです(質問タイトル「iOS 7ステータスバーiOS 6スタイルに戻る?」を参照)。
要約:
これを実現するために、iOS 6以前では下方向のレイアウト変更を元に戻すためにデルタを使用しながら、(iOS 7では)ステータスバーと重なっているUI要素を下にずらしてストーリーボードをできるだけ使用します。その結果、iOS 7で追加のスペースが、backgroundColorが選択した色に設定されたUIViewによって占有されます。後者はコードまたはストーリーボードを使用して作成することができます(下記の代替を参照)。
仮定:
以下の手順を実行するときに目的の結果を得るために、View controller-based status bar appearance
がNOに設定されていて、Status bar style
が「透明な黒スタイル(アルファ0.5)」または「不透明な黒スタイル」に設定されているとします。どちらの設定も、プロジェクト設定の[情報]の下に見つけるか追加することができます。
手順:
ステータスバーの背景として機能するサブウィンドウをUIWindowに追加します。これを実現するには、makeKeyAndVisible
の後にAppDelegateのapplication: didFinishLaunchingWithOptions:
に以下を追加します。
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
UIView *statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, yourAppsUIWindow.frame.size.width, 20)];
statusBarBackgroundView.backgroundColor = [UIColor blackColor];
[yourAppsUIWindow addSubview:statusBarBackgroundView];
}
プログラムでiOS 7の背景を追加しただけなので、iOS 6のレイアウトを維持しながら、ステータスバーと重なるUI要素のレイアウトを調整する必要があります。これを実現するには、次の手順に従います。
Use Autolayout
のチェックが外されていることを確認してください(そうでなければ「iOS 6/7 Deltas」が「サイズ」インスペクタに表示されないためです)。これをする:代替案:
ストーリーボードを多用するプロジェクトでさらに少ないコードを追加し、ステータスバーの背景をプログラムで追加するのではなくステータスバーの背景を自動回転させるには、ビューコントローラのメインビューの一番上にあるカラービューを各ビューコントローラに追加します。次に、この新しいビューの高さデルタを、ビューの高さと同じ負の量に変更します(iOS 6では表示されなくなります)。
この代替手段のマイナス面は(自動回転の互換性を考えれば無視できるかもしれませんが)、Storyboard for iOS 6を見ている場合、この追加のビューはすぐには表示されないということです。ストーリーボードの「ドキュメントの概要」.
View Controllerをステータスバー(およびナビゲーションバー)と重ならないようにするには、 Interface Builder in Xcode 5の[Edge Bars Under Edges]ボックスのチェックを外します。
アップルはテクニカルQ&AをリリースしましたQA1797:ステータスバーがあなたの意見を隠してしまうのを防ぎます。それはiOS 6とiOS 7バージョンのためにうまく働きます。
私はこの厄介な問題を解決するためにたくさんのたくさんのたくさんのそしてたくさんのチュートリアルを見ました。しかし、どれもうまくいきません。これが私の解決策です、そしてそれは私のために働きます:
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と同じように表示されます。私はiOS7のステータスバーが嫌いです! 〜 "〜
Archy Holtの答えに代わる、もう少し簡単な方法があります。
a。 info.plistでUIViewControllerBasedStatusBarAppearance
をNO
に設定します。
b。 AppDelegate
の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
をサブクラス化することを検討することもできます。
私はこれをすべてのView Controllerで使用しました。それは簡単です。この行をすべてのviewDidLoadメソッドに追加します。
- (void)viewDidLoad{
//add this 2 lines:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeNone;
[super viewDidLoad];
}
ステップ1 :1つのviewController
に変更する
[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];
ステップ2 :アプリケーション全体で変更する
info.plist
----> Status Bar Style
--->UIStatusBarStyle to UIStatusBarStyleBlackOpaque
ステップ3 :それぞれのviewWillAppear
にこれを追加してiOS7
のstatusbar
の高さを調整する
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7) {
CGRect frame = [UIScreen mainScreen].bounds;
frame.Origin.y+=20.0;
frame.size.height-= 20.0;
self.view.frame = frame;
[self.view layoutIfNeeded];
}
私はiOS 7でiOS 6のようなステータスバーを達成しました。
Info.plistでUIViewControllerBasedStatusBarAppearanceをNOに設定します。
このコードを- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッドに貼り付けます
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);
//Added on 19th Sep 2013
NSLog(@"%f",self.window.frame.size.height);
self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}
すべてのビューを20ピクセル押し下げる可能性があります。それには、-(void)viewDidAppear:(BOOL)animated
メソッドで次のコードを使用します。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
CGRect frame=self.view.frame;
if (frame.size.height==[[NSUserDefaults standardUserDefaults] floatForKey:@"windowHeight"])
{
frame.size.height-=20;
}
self.view.frame=frame;
}
あなたはdidFinishLauncingメソッドでウィンドウ割り当て後にwindowHeight Userdefaults値を設定しなければなりません
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[NSUserDefaults standardUserDefaults] setFloat:self.window.frame.size.height forKey:@"windowHeight"];
オフセットの問題を解決することを目的としたiOS 6/7 Deltaプロパティを呼び出すInterface Builderにはオプションがあります。
Stack Overflow questionでそれを見てみましょう。Interface Builder:UIViewのLayout iOS 6/7 Deltasとは何ですか?。
Interface Builderを使用している場合は、これを試してください。
あなたのxibファイルで:
1)メインビューを選択し、背景色を黒(またはステータスバーにしたい色は何でも)に設定します
2)背景がコントローラのビューのトップレベルの子として位置する自己完結型サブビューであることを確認してください。
あなたの背景を動かして、コントローラーの見方の直接の子供になりましょう。自動サイズ調整パネルをチェックして、すべてのフレームエッジをロックし、両方の柔軟性軸をアクティブにしたことを確認します。これがUIImageViewの場合は、コンテンツモードを[拡大/縮小]に設定します。プログラム的には、これはcontentModeをUIViewContentModeScaleToFillに設定し、その自動サイズ変更マスクを(UIViewAutoresizingF flexibleWidth | UIViewAutoresizingF flexibleHeight)に設定します。
3)ロックされているものすべてを20 pts下に移動し、iOS 6/7のデルタYを-20に設定します。
自動サイズ調整パネルの一番上のフレームにロックされているすべての一番上のレベルの子は、20pts下に移動し、iOS 6/7デルタYを-20に設定する必要があります。 (Cmdはそれらすべてを選択して、下向き矢印を20回クリックします - 誰かがもっと良い方法はありますか?)
4)柔軟な高さを持つ上記のすべての項目のiOS 6/7デルタ高さを調整します。 フレームの上下に固定されており、自動サイズ調整パネルで高さの調整が有効になっているアイテムでも、iOS 6/7のデルタの高さを20に設定する必要があります。これは直感に反するように思えるかもしれませんが、これらが適用される順序のために、それは必要です。フレームの高さが最初に(デバイスに基づいて)設定され、次にデルタが適用され、最後にすべての子フレームのオフセット位置に基づいて自動サイズ調整マスクが適用されます。
5)最後に、一番下のフレームにロックされていても一番上のフレームにはロックされていない項目には、デルタはまったく必要ありません。
それはあなたにiOS7とiOS6であなたに同じステータスバーを与えるでしょう。
一方、iOS 6の互換性を維持しながらwant iOS 7のスタイルを設定する場合は、背景ビューのdelta Y/delta heightの値を0に設定します。
より多くのiOS7移行情報を見るためには、完全なポストを読んでください: http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html
自動レイアウトを使用すると、これ以上フレームを直接操作できないため、これは圧倒的な問題になる可能性があります。あまり手間をかけずに簡単な解決策があります。
ユーティリティクラスでユーティリティメソッドを書いて、すべてのView ControllerのviewDidLayoutSubviews
メソッドからそれを呼び出しました。
+ (void)addStatusBarIfiOS7:(UIViewController *)vc
{
if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1) {
CGRect viewFrame = vc.view.frame;
if(viewFrame.Origin.y == 20) {
//If the view's y Origin is already 20 then don't move it down.
return;
}
viewFrame.Origin.y+=20.0;
viewFrame.size.height-= 20.0;
vc.view.frame = viewFrame;
[vc.view layoutIfNeeded];
}
}
ステータスバーが必要なビューコントローラのviewDidLayoutSubviews
メソッドをオーバーライドします。それはあなたがAutolayoutの負担を乗り越えるでしょう。
- (void)viewDidLayoutSubviews
{
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];
[super viewDidLayoutSubviews];
[MyUtilityClass addStatusBarIfiOS7:self];
}
私の解決策は、iOS 7の場合、ウィンドウの上に20ポイントの高さのUIView
を追加することでした。それから、私はAppDelegateクラスに "solid"ステータスバーの背景を表示/非表示にするメソッドを作成しました。 application:didFinishLaunchingWithOptions:
内:
// ...
// Add a status bar background
self.statusBarBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.bounds.size.width, 20.0f)];
self.statusBarBackground.backgroundColor = [UIColor blackColor];
self.statusBarBackground.alpha = 0.0;
self.statusBarBackground.userInteractionEnabled = NO;
self.statusBarBackground.layer.zPosition = 999; // Position its layer over all other views
[self.window addSubview:self.statusBarBackground];
// ...
return YES;
それから私は黒いステータスバーの背景をフェードイン/アウトする方法を作成しました:
- (void) showSolidStatusBar:(BOOL) solidStatusBar
{
[UIView animateWithDuration:0.3f animations:^{
if(solidStatusBar)
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
self.statusBarBackground.alpha = 1.0f;
}
else
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
self.statusBarBackground.alpha = 0.0f;
}
}];
}
今必要なのは[appDelegate showSolidStatusBar:YES]
だけです。
その最も簡単な方法はあなたの最新のXcodeに古いSDKをインストールすることです。
最新のXcodeに古いSDKをインストールするにはどうすればいいですか?
Uは http://www.4shared.com/Zip/NlPgsxz6/iPhoneOS61sdk.htmlからiOS 6.1 SDKを入手することができます または古いXcodeをダウンロードしてそのコンテンツからSDKを入手する
このフォルダを/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKsに解凍して貼り付けます。
Xcodeを再起動してください。
お役に立てば幸いです。それは私のために働いた=)
私はこの回答に遅れていますが、私は自分がしたことを共有したいだけです。これは基本的に最も簡単な解決策です。
まず第一に - >あなたのinfo.plist
ファイルに行き、そして ステータスバースタイルを追加してください - >透明な黒スタイル(0.5のアルファ)
今、ここでそれは行きます: -
このコードを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;
}
presentViewController:animated:completion:
をwindow.rootViewController.view
とめちゃくちゃにして使用しているので、この問題に対する別のアプローチを見つける必要がありました。私はようやく私のrootViewControllerのUIViewをサブクラス化することによってモーダルと回転を扱うことができました。
.h
@interface RootView : UIView
@end
.m
@implementation RootView
-(void)setFrame:(CGRect)frame
{
if (self.superview && self.superview != self.window)
{
frame = self.superview.bounds;
frame.Origin.y += 20.f;
frame.size.height -= 20.f;
}
else
{
frame = [UIScreen mainScreen].applicationFrame;
}
[super setFrame:frame];
}
- (void)layoutSubviews
{
self.frame = self.frame;
[super layoutSubviews];
}
@end
これで、iOS 7アニメーションに対する強力な回避策があります。
これは共有するには遅すぎるかもしれませんが、私はUINavigationBarをサブクラス化しようとしていて、黒いステータスバーとステータスバーのテキストを白で表示することを望んでいました。
これが私がそのために働いているのがわかります
self.navigationController?.navigationBar.clipsToBounds = true
self.navigationController?.navigationBar.translucent = false
self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()
ステータスバーの背景を黒、ステータスバーのテキストを白、ナビゲーションバーの色を白にしました。
iOS 9.3、Xコード7.3.1
SetStatusBarHiddenを使い続けるには、このカテゴリを使います。
@interface UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden;
@end
@implementation UIApplication (StatusBar)
-(void)setIOS7StatusBarHidden:(BOOL)statusBarHidden{
if (!IOS7) {
[self setStatusBarHidden:statusBarHidden];
return;
}
if ([self isStatusBarHidden] == statusBarHidden) {
return;
}
[self setStatusBarHidden:statusBarHidden];
[self keyWindow].clipsToBounds = YES;
CGFloat offset = statusBarHidden ? 0 : 20;
[self keyWindow].frame = CGRectMake(0,offset,[self keyWindow].frame.size.width,[self keyWindow].frame.size.height-offset);
[self keyWindow].bounds = CGRectMake(0, offset, [self keyWindow].frame.size.width,[self keyWindow].frame.size.height);
}
@end
私の非常に簡単な解決策は(あなたが垂直方向のみをサポートしていると仮定して)7より下のiOSバージョンのためにアプリケーションデリゲートdidFinishLaunchingWithOptionsメソッドでアプリケーションウィンドウ境界を再定義することです:
CGRect screenBounds = [[UIScreen mainScreen] bounds];
if ([HMService getIOSVersion] < 7) {
// handling statusBar (iOS6) by leaving top 20px for statusbar.
screenBounds.Origin.y = 20;
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
else {
self.window = [[UIWindow alloc] initWithFrame:screenBounds];
}
ステータスバーをまとめて非表示にすることができます。だからあなたのアプリはフルスクリーンになります。私はそれがあなたが得るだろう最高だと思います。
ターゲット設定でUIStatusBarStyleNone
または設定します。
IOS 7のステータスバーを隠すには:
1.アプリケーションのinfo.plistファイルに移動します。
2.And Set、View Controllerベースのステータスバーの外観:ブールNO
私はステータスバーの問題を解決したい.....
私がここで見つけたのは、iOS7でのこのナビゲーションバーの問題に対する最良の代替案と解決策です。
http://www.appcoda.com/customize-navigation-status-bar-ios-7/ /
私たちのすべての質問と心配が解消されることを願っています。