iOSアプリのステータスバーがiOS 6のデフォルトスタイルに戻る


292

iOS 7 UIStatusBarでは、次のようにビューとマージするように設計されています。

TinaTavčarによって設計されたGUITinaTavčarによって設計されたGUI )

  • かっこいいですが、ビューの上部に何かがあると、ビューがややめちゃくちゃになり、ステータスバーと重なってしまいます。

  • それが機能する方法を変更することができる簡単な解決策(info.plistのプロパティの設定など)はありますか?

  • より簡単な解決策はself.view.center.x、すべての単一のビューコントローラーに+ 20ポイントを設定することですが、それらを変更すると他のディメンションがself.view.center.x台無しになり(異なるものを使用すると、カスタムセグエに問題が発生する可能性があります)、突然、次のような面倒な作業になります。避けるのが最善です。

  • 誰かがこのためのワンライナーソリューションを提供してくれたら本当に嬉しいです。

PS私はステータスバーを非表示にできることを知っています

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

didFinishLaunchingWithOptions、私は真の解決策と考えないようにする方法、それは、回避策、この問題を回避ショートカットは、です。


6
悲しいことに黒いステータスバーは
iOS

@GangstaGrahamに同意します。それらの色はただ美しいです!あなたの質問に答えるために、私はあなたができないと思います。ステータスバーがこのように設計されている理由は、半透明性が新しいiOSのものであり、何かの上にあると言うことによってアプリケーションに「深さ」を与えるように設計されているため、その下に何かがあります。
Cole Johnson

preferredStatusBarStyleをUIStatusBarDefaultに設定してみましたか?iOS 7 UIViewControllerドキュメントの
theaob 2013

1
持つUIStatusBarDefaultステータスバーのためには、色だけでその内容黒になります。それはそれが機能する方法をiOS6での状態に戻すことはしません。
吖奇说-何魏奇Archy Will He '08 / 08/22

2
これで運はありますか?私はiOS7が大好きですが、これは私を夢中にさせています!
Mihai Fratu 2013

回答:


449

これは私が書いたブログ投稿からクロスポストされいますが、iOS 7のステータスバー、ナビゲーションバー、コンテナービューコントローラーの詳細は次のとおりです。

  1. iOS 6スタイルのステータスバーレイアウトを保持する方法はありません。ステータスバーは常にiOS 7上のアプリケーションと重なります

  2. ステータスバーの外観とステータスバーのレイアウトを混同しないでください。外観(ライトまたはデフォルト)は、ステータスバーのレイアウト(フレーム/高さ/オーバーラップ)には影響しません。また、システムステータスバーの背景色がなくなったことにも注意してください。APIがUIStatusBarStyleLightContentを参照する場合、それらは明確な背景の白いテキストを意味します。UIStatusBarStyleDefaultは、クリアな背景の黒いテキストです。

  3. ステータスバーの外観は、相互に排他的な2つの基本パスの1つに沿って制御されます。プログラムで従来の方法で設定するか、UIKitがUIViewControllerの新しいプロパティに基づいて外観を更新します。後者のオプションはデフォルトでオンになっています。「ViewController-Based Status Bar Appearance」のアプリのplist値を確認して、使用しているものを確認します。この値をYESに設定した場合、アプリのすべてのトップレベルのビューコントローラー(標準のUIKitコンテナービューコントローラー以外)は、preferredStatusBarStyleをオーバーライドして、デフォルトスタイルまたはライトスタイルを返す必要があります。plist値をNOに編集すると、使い慣れたUIApplicationメソッドを使用してステータスバーの外観を管理できます。

  4. UINavigationControllerは、UINavigationBarの高さを、かなり奇妙で文書化されていない一連の制約に応じて、44ポイントまたは64ポイントに変更します。UINavigationControllerは、ビューのフレームの上部がUIWindowの上部と視覚的に隣接していることを検出すると、高さ64ポイントのナビゲーションバーを描画します。ビューの上部がUIWindowの上部に隣接していない場合(1ポイントだけ離れている場合でも)、ナビゲーションバーは高さ44ポイントの「従来の」方法で描画されます。このロジックは、アプリケーションのビューコントローラー階層内のいくつかの子であっても、UINavigationControllerによって実行されます。この動作を防ぐ方法はありません。

  5. 高さがわずか44ポイント(88ピクセル)のカスタムナビゲーションバーの背景画像を指定し、UINavigationControllerのビューの境界がUIWindowの境界と一致する場合(#4で説明)、UINavigationControllerはフレーム(0,20,320)に画像を描画します、44)、カスタム画像の上に不透明な黒いスペースを20ポイント残します。これは、ルール#1をバイパスした賢い開発者であると勘違いするかもしれませんが、あなたは間違っています。ナビゲーションバーの高さは64ポイントのままです。スライドして表示するスタイルのビュー階層にUINavigationControllerを埋め込むと、これが非常に明確になります。

  6. UIViewControllerのわかりにくい名前が付けられたEdgesForExtendedLayoutプロパティに注意してください。ほとんどの場合、edgesForExtendedLayoutを調整しても何も起こりません。UIKitがこのプロパティを使用する唯一の方法は、ビューコントローラーをUINavigationControllerに追加する場合、UINavigationControllerはedgeForExtendedLayoutを使用して、その子ビューコントローラーをナビゲーションバー/ステータスバー領域の下に表示するかどうかを決定します。UINavigationController自体にEdgesForExtendedLayoutを設定しても、UINavigationControllerに高さ44または64ポイントのナビゲーションバー領域があるかどうかは変わりません。そのロジックについては、#4を参照してください。ツールバーまたはUITabBarControllerを使用する場合、同様のレイアウトロジックがビューの下部に適用されます。

  7. UINavigationController内でカスタムの子ビューコントローラーがナビゲーションバーに重ならないようにする場合は、edgesForExtendedLayoutをUIRectEdgeNone(または少なくともUIRectEdgeTopを除外するマスク)に設定します。この値は、View Controllerのライフサイクルのできるだけ早い段階で設定してください。

  8. UINavigationControllerとUITabBarControllerは、サブビュー階層内のテーブルビューとコレクションビューのcontentInsetsの埋め込みも試みます。これは、#4のステータスバーロジックと同様の方法で行われます。テーブルビューとコレクションビューに対して自動的にAdjustsScrollViewInsetsをNOに設定することにより、これを防止するプログラム的な方法があります(デフォルトはYESです)。contentInset調整を使用して、ツールバーとキーボードの動きに応じてテーブルビューのレイアウトを制御するため、WhisperとRiposteに深刻な問題が発生しました。

  9. 繰り返しますが、iOS 6スタイルのステータスバーレイアウトロジックに戻る方法はありません。これを概算するには、アプリのすべてのビューコントローラーを、画面の上部から20ポイントだけオフセットされたコンテナービューに移動し、ステータスバーの後ろに意図的に黒いビューを残して、古い外観をシミュレートする必要があります。これは、RiposteとWhisperで使用した方法です。

  10. Appleは、あなたが#9をしようとしないようにするために、一生懸命に努力しています。彼らは私たちにすべてのアプリを再設計してステータスバーを重ねてほしいと望んでいます。ただし、ユーザーエクスペリエンスと技術的な理由の両方から、多くの説得力のある議論があります。なぜこれが常に良い考えとは限らないのか、ユーザーは、プラットフォームの奇抜さを単に理解するだけでなく、ユーザーにとって最善の方法を実行する必要があります。


35
ビューの上部にあるものに制約を追加して、上部のレイアウトガイドに接続できることを追加したかっただけです。これにより、ステータスバーの後ろに空白ができます(必要な色で埋めることができます)。ただし、iOS 6でもビューを自動的に正しい位置に調整できます。これにより、コード内でビューの位置を手動で調整する必要がなくなります。
BreadicalMD 2013

4
それは素晴らしいソリューションです。AutoLayoutについての無知を暴露しました。乗ったほうがいい。
jaredsinclair 2013

1
オブジェクトの上部スペースを上部レイアウトガイドの端の下に配置する場合、制約コントロールを使用して、最も近い隣に垂直間隔制約を追加できます。これは、現在、上部レイアウトガイドになります。または、オブジェクトから上部のレイアウトガイドにCtrlキーを押しながらクリックして、垂直間隔の制約を明示的に追加できます。
BreadicalMD 2013

2
@BreadicalMD理解できないことの1つは、-topLayoutGuideがiOS 6では使用できないことです。つまり、iOS 7と6で異なる自動レイアウト制約を使用する必要があるということですか。
ジェレミー

1
正解です...でも疑問が1つあります1)UINavigationControllerが高さの部分を変更しています。もう少し説明してください。感謝
user1010819 2013年

122

2013年9月19日の更新:

追加によりスケーリングのバグを修正 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);

NSNotificationCenterステートメントの誤字を修正


2013年9月12日の更新:

修正UIViewControllerBasedStatusBarAppearanceNO

画面回転を伴うアプリのソリューションを追加しました

ステータスバーの背景色を変更する方法を追加しました。


明らかに、iOS7のステータスバーをiOS6での動作に戻す方法はありません。

ただし、常にいくつかのコードを記述して、ステータスバーをiOS6のようにすることができます。これは、私が思いつくことができる最も短い方法です。

  1. inに設定UIViewControllerBasedStatusBarAppearanceします(UIApplicationstatusBarStyleメソッドを使用してステータスバースタイルを設定できるように、ビューコントローラーがステータスバースタイルを調整しないようにするには)。NOinfo.plist

  2. 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;
    


のために:

  1. iOS 7かどうかを確認します。

  2. ステータスバーのコンテンツを、UIStatusBarStyleDefaultではなく白に設定します。

  3. フレームが可視の境界を超えて伸びているサブビューが表示されないようにします(上からメインビューにアニメートするビューの場合)。

  4. アプリのウィンドウフレームをシフトしてサイズを変更することで、ステータスバーが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ステートメントがトリガーされて、アプリの画面の向き(縦向き、逆向き、横向き左、または横向き右)が検出され、アプリのウィンドウフレームがそれぞれ変更されて、iOS 6のステータスバーの錯覚が作成されます。


ステータスバーの背景色を変更するには:

追加

 @property (retain, nonatomic) UIWindow *background;

AppDelegate.h作るためbackground、あなたのクラスのプロパティを、それを割り当て解除からARCを防ぎます。(ARCを使用していない場合は、その必要はありません。)

その後、次の場所でUIWindowを作成する必要がありますif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)

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

@synthesize background;後を忘れないでください@implementation AppDelegate


3
これは回転で壊れます。ただのヘッズアップ
ジェシー・ノーファー2013

2
@JesseNaugherプログラムで垂直間隔制約を0から20に変更することをお勧めします。回転に働きます。
エキスパート

2
ナビゲーションバーが20ピクセル拡大するのをどのように回避できるかについてのアイデアはありますか?このソリューションは私にとっては問題ありませんが、ナビゲーションバーが20ピクセル高すぎます。
simonbs 2013

4
@ArchyHolt:モーダルビューコントローラーを提示する場合を除いて、あなたの簡単な解決策は私にとってはうまくいきます。モーダルビューコントローラーを閉じると、残りのビューがステータスバーの下に表示されます。私はこれを新しいサンプルプロジェクトで再現して、他にファンキーなことが起こっていないことを確認しています。あなたのより高度なソリューションがここで役立つかもしれないと私は考えていますが、どの通知が機能するかわかりません。何か案は?
markdorison 2013

4
モーダルビューコントローラーを閉じると、ビューがリセットされます。:(
KarenAnne 2013

41

更新(新しいソリューション)

この更新は、iOS 7のナビゲーションバーの問題の最善の解決策です。ナビゲーションバーの色の例を設定できます。FakeNavBar.backgroundColor = [UIColor redColor];

注:デフォルトのナビゲーションコントローラを使用する場合は、古いソリューションを使用してください。

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ピクセルから始まります。

注:iOS 6/7 Deltaは、詳細ペインの[ファイルインスペクター](左端のアイコン)でView Controllerの[自動レイアウトを使用]をオフにした場合にのみ表示されます。

ここに画像の説明を入力してください


6
あなたは私の一日を作りました。助けのために+1してください!
Niru Mukund Shah 2013

5
注:iOS 6/7 Deltaは、詳細ペインの[ファイルインスペクター](左端のアイコン)でView Controllerの[自動レイアウトを使用]をオフにした場合にのみ表示されます。
Matt

1
どうもありがとう!あなたは私に多くのトラブルを救った!
neowinston 2013年

2
iOS 6スタイルのステータスバーのレイアウトを維持できないと言った人は、@TacettinÖzbölükの方法でこれを行うことができます...このawsumソリューションに感謝します。
Vizllx 2013年

1
良いですね!また、アップルが今これを好むことに注意してください:if(NSFoundationVersionNumber> = NSFoundationVersionNumber_iOS_6_1){}
Joel Balmer 14

26

解決 :

メソッドをオーバーライドして、ビューコントローラーまたはrootviewcontrollerで設定します。

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }

悪い解決策ではありません。バーを完全に取り外します。常にUXには理想的ではないかもしれませんが、実行可能です。
Farhan Hafeez 2013

単に素晴らしいです。完璧に働いた。
madLokesh 2013年

シナリオ:ビデオを全画面表示した後にUIVIewに切り替えると、ステータスバーのサイズと同じ大きさの黒いバーが下部に表示されますが、既にステータスバーを使用していました。ステータスバーを完全に削除し、問題を修正しました。
madLokesh 2013年

私はこの方法でのみ成功しました
user2277872

17

ここでは、ストーリーボードを広範囲に使用するプロジェクトの別のアプローチを示します。

ゴール:

このアプローチの目標は、iOS6と同じステータスバースタイルをiOS7で再作成することです(質問タイトル「iOS 7ステータスバーをiOS 6スタイルに戻す?」を参照)。

概要:

これを実現するには、ステータスバー(iOS 7の場合)と重なっているUI要素を下にシフトし、デルタを使用してiOS 6.1以前のレイアウトの変更を元に戻し、ストーリーボードをできるだけ使用します。iOS 7で結果として生じる余分なスペースは、backgroundColorが選択した色に設定されたUIViewによって占有されます。後者は、コードで作成するか、ストーリーボードを使用して作成できます(以下の代替案を参照)。

前提:

以下の手順に従って希望の結果を得るには、View controller-based status bar appearanceがNOにStatus bar style設定され、「透明な黒のスタイル(アルファ0.5)」または「不透明な黒のスタイル」に設定されていると想定されます。両方の設定は、プロジェクト設定の[情報]で確認または追加できます。

手順:

  • ステータスバーの背景として機能するサブウィンドウをUIWindowに追加します。これを達成するには、AppDelegateのapplication: didFinishLaunchingWithOptions:後に次を追加しますmakeKeyAndVisible

    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の背景のみを追加したので、iOS6のレイアウトを維持しながら、ステータスバーで重なっているUI要素のレイアウトを調整する必要があります。これを行うには、以下を実行します。

    • Use Autolayoutストーリーボードがオフになっていることを確認します(そうでない場合、サイズインスペクターに「iOS 6/7 Deltas」が表示されないためです)。これをする:
      • ストーリーボードファイルを選択
      • ユーティリティを表示
      • [ファイルインスペクタを表示]を選択します
      • 「Interface Builder Document」の下で「Use Autolayout」のチェックを外します
    • 必要に応じて、iOS 7と6の両方のレイアウト変更を適用するときに監視するのに役立つように、[アシスタントエディター]を選択し、[プレビュー]と[iOS 6.1以前]を選択します。 ここに画像の説明を入力してください ここに画像の説明を入力してください
    • ステータスバーと重ならないように、調整するUI要素を選択します
    • [ユーティリティ]列で[サイズインスペクタを表示]を選択します
    • ステータスバーのbgの高さと同じ量だけ、UI要素をY軸に沿って再配置します。 ここに画像の説明を入力してください
    • そして、YのiOS6 / 7 Deltas値をstatusbar bg heightと同じ負の量だけ変更します(使用している場合は、iOS 6プレビューの変更に注意してください)。 ここに画像の説明を入力してください

代替案:

ストーリーボードを多用するプロジェクトに追加するコードをさらに少なくし、ステータスバーの背景を自動回転させるには、ステータスバーの背景をプログラムで追加する代わりに、ビューコントローラーのメインビューの最上部にある各ビューコントローラーに色付きのビューを追加できます。次に、この新しいビューの高さのデルタをビューの高さと同じ負の値に変更します(iOS 6でビューを非表示にするため)。

この代替手段の欠点(自動回転の互換性を考慮しても無視できるかもしれません)は、iOS 6のストーリーボードを表示している場合、この余分なビューがすぐには表示されないという事実です。ストーリーボードのドキュメント概要」。


12

ビューコントローラがステータスバー(およびナビゲーションバー)と重ならないようにする場合は、Xcode 5のInterface Builderで[ Extending Edges Under Top Bars]ボックスをオフにします。

トップバーの下のエッジを延長するのチェックを外します


7
あなたはストーリーボードを使用する場合にのみ可能です
・クール

3
ナビゲーションコントローラーやタブバーコントローラーなどのコンテナーvcでのみ機能します
Andrea

2
edgeForExtendedLayoutは、コンテナビューコントローラ(UINavigationControllerなど)によってのみ使用され、その子のビューを親のクロムでオーバーラップするかどうかを決定します。UIWindowのルートビューコントローラーでこのプロパティを設定しても何も起こりません。:上記の私の答えを参照してくださいstackoverflow.com/questions/18294872/...
jaredsinclair

UITabBarController @Andreaをどのように実行しますか?ありがとう。
KarenAnne 2013

@KarenAnneプログラムで行うか、ストーリーボードで行うかによって異なります。プログラムでは、edgesForExtentプロパティを、UITabBarViewController内に表示しているビューコントローラーで好きなように設定する必要がありますが、ステータスバーの問題が発生しないようにするには、UITabbarController内にuinavigationcontrollerをロードする必要があります。ここをチェックしてください。developer.apple.com/library/ios/documentation/UserExperience/...
アンドレア

11

AppleがテクニカルQ&A QA1797:ステータスバーがビューを覆い隠さないようにするをリリースしました。iOS 6およびiOS 7バージョンでは問題なく動作します。


5
Appleは、誰もが自動レイアウトを使用していると想定しています。Xcode 4では自動レイアウトはひどいもので、Xcode 5はリリースされたばかりなので、これは疑わしい仮定です。
Glenn Maynard

1
しかし、見通しでは、これはルートウィンドウまたはステータスバーのフレームのサイズを変更するよりも良い解決策です。
Igor

私の知る限り、rootViewControllerがsplitViewControllerである場合、Appleのソリューションは機能しません。
Vern Jensen

8

私はこの気の利かない問題を修正するためにたくさんのたくさんのチュートリアルを見てきました。しかし、どれも機能しません!これが私の解決策であり、私にとってはうまくいきます:

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;
    }
}

ロジックは簡単です。すべての子ビューを20ピクセルでself.viewにシフトします。それで全部です。その後、スクリーンショットはiOS 6と同じように表示されます。私はiOS7ステータスバーが嫌いです!〜 "〜


2
これはどこに追加すればよいですか?アプリのデリゲートでオプションを使用して起動しましたか?
mhmdshawqi

これを行うと、ステータスバーが白くなります
ropo

6

Archy Holtの答えの小さな代替、もう少し簡単です:

a。設定するUIViewControllerBasedStatusBarAppearanceNOInfo.plistファイルに

b。呼び出し:AppDelegateapplication: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ます。


presentViewController:animated:completion:に問題がありますか?
桐DJO

:真TùngĐỗ、私は良い作品代替作って@ stackoverflow.com/questions/18294872/...
・クール

5

私はすべてのView Controllerでこれを使用しましたが、それは簡単です。この行をすべてのviewDidLoadメソッドに追加します。

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

    [super viewDidLoad];
}

1
魅力のように機能し、とても簡単でした。ルビーモーションでは、superを呼び出す前に、self.edgesForExtendedLayout = UIRectEdgeNone if respondsToSelector( "edgesForExtendedLayout")
tehprofessor 2013年

4

この簡単な方法を試してください...

ステップ1:シングルに変更するにはviewController

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

手順2:アプリケーション全体を変更するには

info.plist
      ----> Status Bar Style
                  --->UIStatusBarStyle to UIStatusBarStyleBlackOpaque

ステップ3:これをそれぞれviewWillAppearに追加してstatusbar高さを調整しますiOS7

    [[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];
    }


3

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"];

より良い方法は、UINavigationBar heightを44ではなく64にすることです。そうすると、Appleのアプリのように、バーが一番上まで伸びます。
アーロンブラジャー2013年

@AaronBragerしかし、私の要件はiOS 6スタイルのステータスバーを表示することでした。
デザートローズ

iOS 7の横向きのソリューションを追加できますか?私も同じことをしています。iOS 7ランドスケープでは機能しません。
sathiamoorthy 2013

@DesertRose THX!これは私にとってはうまくいきますが、下部のuitabbarをカットします。私は3つのビューを持つタブバーコントローラーベースのアプリを持っています。そのうち2つはtableviewcontrollersです。
marciokoko 2013年

1
私がデバイスを回転させるまで(私のiOS 7デバイスはiPadです)、これで完全に修正されます。しかし、いったん回転すると、黒いバーはそのままの位置に留まり、「ビュー」(それが間違った専門用語の場合、申し訳ありませんが、私はPhoneGap / webの人です)は、収縮した高さを維持します。幅。このソリューションはローテーションをサポートしていませんが、これは私が見た中で最高の修正です-デバイスのローテーションを監視するためにどのように改善できますか?ありがとう!
tylerl 2013

2

Interface Builderを使用している場合は、次のことを試してください。

xibファイルで:

1)メインビューを選択し、背景色を黒(またはステータスバーにしたい色)に設定します。

2)背景が、コントローラーのビューの最上位の子として配置された自己完結型のサブビューであることを確認します。
背景を移動して、コントローラーのビューの直接の子にします。自動サイズ設定パネルをチェックして、すべてのフレームエッジがロックされ、両方の柔軟性軸がアクティブになっていることを確認します。これがUIImageViewの場合、コンテンツモードを[塗りつぶす]に設定します。プログラム的にこれは、UIViewContentModeScaleToFillに設定されたcontentModeに変換され、自動サイズ変更マスクが(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)に設定されます。

3)次に、上にロックされているすべてのものを20ポイント下に移動し、iOS 6/7デルタYを-20に設定します。
自動サイズ設定パネルの上部フレームにロックされているすべてのトップレベルの子は、20ポイント下に移動し、iOS 6/7デルタYを-20に設定する必要があります。(Cmdでそれらすべてを選択し、下矢印を20回クリックします-誰よりも良い方法はありますか?)

4)柔軟な高さを持っていた上記のすべてのアイテムのiOS 6/7デルタの高さを調整します。 フレームの上部と下部にロックされ、自動サイズ調整パネルでフレキシブルな高さが有効になっているアイテムは、iOS 6/7デルタの高さが20に設定されている必要があります。これには、上記の背景ビューが含まれます。これは直感に反するように見えるかもしれませんが、これらが適用される順序により、必要です。フレームの高さが最初に(デバイスに基づいて)設定され、次にデルタが適用され、最後にすべての子フレームのオフセット位置に基づいて自動サイズ変更マスクが適用されます-少し考えてみると、理にかなっています。

5)最後に、下部フレームにロックされているが上部フレームにはロックされていないアイテムは、デルタをまったく必要としません。

これにより、iOS7とiOS6で同じステータスバーが表示されます。

あなたは一方、欲しい iOS6の互換性を維持しながら、iOS7スタイリングを、そして背景ビューのために0にデルタY /デルタ高さの値を設定します。

より多くのiOS7の移行情報を参照するには、完全なポストを読む:http://uncompiled.blogspot.com/2013/09/legacy-compatible-offsets-in-ios7.html


自動レイアウトを使用する場合はデルタなし
lostintranslation

2

私の解決策はUIView、iOS 7のときにウィンドウの上部に高さ20ポイントのを追加することでした。次に、AppDelegateクラスにメソッドを作成して、「ソリッド」ステータスバーの背景を表示/非表示にしました。で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]、必要なときに電話をかけることだけです。


2

自動レイアウトを使用すると、フレームを直接操作できなくなるため、これは非常に大きな問題になる可能性があります。余計な手間をかけずに簡単な解決策があります。

ユーティリティクラスでユーティリティメソッドを作成して、すべてのビューコントローラの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];
}

1

これを行う最も簡単な方法は、古いSDKを最新のXcodeにインストールすることです。

古いSDKを最新のXcodeにインストールする方法は?

  1. Uは、http: //www.4shared.com/zip/NlPgsxz6/iPhoneOS61sdk.htmlからiOS 6.1 SDKを取得するか、古いXcodeをダウンロードしてそのコンテンツからSDKを取得できます。

  2. このフォルダを解凍して/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKsに貼り付けます

  3. xcodeを再起動します。

  4. プロジェクトのビルド設定で古いSDKを選択できるようになりました

お役に立てば幸いです。それは私のために働きました=)


私のために働いた。@marcelosalloumに感謝しますが、私の電話ギャップ(uiwebview)アプリの回避策を探して、アプリの将来の更新のためにiOS7の透明なステータスバーをサポートします。再度、感謝します。;)
ハニズム2013年

@marcellosaloum、アプリがAppleに受け入れられますか?彼らは、XCode 4でコンパイルされたアプリはもはや受け入れられないだろうと言っています...それは実際にはiOS 6 SDKを意味します。
Valerio 14

Xcode5が古いiOS SDKをコンパイルできるため、私のアプリは確かに受け入れられました。AppStoreがXcode4でビルドされたアプリを拒否するかどうかはわかりませんが、あなたが言ったように(Xcode4!= iOS 6 SDK)。
marcelosalloum 2014

2月1日以降ですか。その日、アップルはそれを義務付けました。
Valerio 2014

いいえ、昨年、そのコードに最後に触れました。Appleがそれを必須にしたことを知りませんでした(しかし、知りたくありませんでした)。それを言うリンクをここに投稿していただけませんか?乾杯
marcelosalloum 14

1

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

これで、iOS7アニメーションに強力な回避策があります。


1

私はこの回答に遅れていますが、私がしたことを共有したいだけです。これは基本的に最も簡単な解決策です

まず最初に-> info.plistファイルに移動し、ステータスバースタイル追加します- >透明な黒のスタイル(Alpha of 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;
   }

0

私の非常に単純な解決策(垂直方向のみがサポートされていると想定)は、アプリケーションデリゲートのdidFinishLaunchingWithOptionsメソッドで、7以下のiOSバージョンのアプリケーションウィンドウ境界を再定義することです。

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];
}

コードは 'y'を0から20にシフトするだけですが、それに応じて高さを調整しないため、screenBounds.size.height-= 20を追加する必要があります。screenBounds.origin.y = 20の直後;
アミットC.

0

ステータスバーをまとめて非表示にすることができます。したがって、アプリはフルスクリーンになります。私はそれがあなたが手に入れる最高のものだと思います。

UIStatusBarStyleNone またはターゲット設定で設定します。


2
UIStatusbarstylenoneを指定する場所
user4951

0

iOS 7でステータスバーを非表示にする手順:

1.アプリケーションのinfo.plistファイルに移動します。

2.そして、設定、ビューコントローラベースのステータスバーの外観:ブールNO

ステータスバーの問題が解決したと思います。


0

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


0

これは共有するには遅すぎるかもしれませんが、誰かに役立つかもしれない何か貢献することがあり、UINavigationBarをサブクラス化しようとしていて、ステータスバーが黒でステータスバーのテキストが白のios 6のように見せたかったのです。

これは私がそのために働いていたものです

        self.navigationController?.navigationBar.clipsToBounds = true
        self.navigationController?.navigationBar.translucent = false
        self.navigationController?.navigationBar.barStyle = .Black
        self.navigationController?.navigationBar.barTintColor = UIColor.whiteColor()

ステータスバーの背景が黒、ステータスバーのテキストが白、ナビゲーションバーの色が白になりました。

iOS 9.3、XCode 7.3.1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.