web-dev-qa-db-ja.com

iPhone 7のiOS 7ステータスバーをiOS 6のデフォルトスタイルに戻す?

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

GUI designed by Tina Tavčar (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メソッドでは、これは回避策、問題を回避する近道なので、私はそれを本当の解決策とは考えていません。

291
Archy Will He

これは から書いたブログ投稿 からのクロス投稿ですが、ここではiOS 7のステータスバー、ナビゲーションバー、およびコンテナビューコントローラについて詳しく説明します。

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

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

  3. ステータスバーの外観は、相互に排他的な2つの基本パスのいずれかに沿って制御されます。伝統的な方法でそれらをプログラムで設定するか、またはUIViewControllerの新しいプロパティに基づいてUIKitが外観を更新します。後者のオプションはデフォルトでオンになっています。 「ViewControllerベースのステータスバーの外観」のアプリのplist値を調べて、どれを使用しているかを確認します。この値をYESに設定した場合、アプリ内のすべての最上位のView Controller(標準のUIKitコンテナView Controller以外)は、preferredStatusBarStyleをオーバーライドして、デフォルトまたはライトスタイルを返す必要があります。 plist値をNOに編集した場合は、よく知られているUIApplicationメソッドを使ってステータスバーの外観を管理できます。

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

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

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

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

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

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

  10. #9をやらないようにするために、Appleは非常に懸命に努力しています。彼らは私たちがステータスバーをアンダーラップするように私たちのすべてのアプリを再設計することを望んでいます。ただし、ユーザーエクスペリエンスと技術的な理由の両方から、多くの説得力のある議論があります。なぜなら、これは必ずしも良い考えではないからです。単純にプラットフォームの風変わりに従うのではなく、ユーザーにとって最善のことをするべきです。

449
jaredsinclair

2013年9月19日の更新情報

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

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


2013年9月12日の更新情報

UIViewControllerBasedStatusBarAppearanceNOに修正

画面を回転させるアプリのためのソリューションを追加しました

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


どうやら、iOS 7のステータスバーをiOS 6での動作に戻す方法はありません。

しかし、私たちはいつでもいくつかのコードを書いてステータスバーをiOS 6のように変えることができます、そしてこれが私が思い付くことができる最も短い方法です:

  1. info.plistUIViewControllerBasedStatusBarAppearanceNOに設定します(View Controllerにステータスバースタイルを調整させることで、UIApplicationstatusBarStyleメソッドを使用してステータスバースタイルを設定できるようにします)

  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ステートメントがトリガーされて、アプリの画面の向き(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を忘れないでください!

122
Archy Will He

更新(新しい解決策)

このアップデートは、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ピクセルから始まっています。

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

Enter image description here

41

解決策:

メソッドをオーバーライドして、あなたのviewcontrollerまたはrootviewcontrollerに設定してください。

-(BOOL) prefersStatusBarHidden
    {
        return YES;
    }
26
dave

ストーリーボードを多用するプロジェクトに対する別のアプローチは次のとおりです。

目標:

このアプローチの目的は、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」が「サイズ」インスペクタに表示されないためです)。これをする:
      • ストーリーボードファイルを選択します
      • ユーティリティを表示する
      • 「ファイルインスペクタを表示する」を選択します
      • [Interface Builder Document]の下の[Use Autolayout]のチェックを外します。
    • 必要に応じて、適用時にiOS 7と6の両方のレイアウト変更を監視できるようにするには、[アシスタントエディタ]を選択し、[プレビュー]と[iOS 6.1以前]を選択します。 enter image description hereenter image description here
    • ステータスバーと重ならないように、調整したいUI要素を選択します。
    • Utilities列で "Show the Size Inspector"を選択してください。
    • ステータスバーのbg heightと同じ量だけ、UI要素をY軸に沿って再配置します。 enter image description here
    • そしてYのiOS6/7デルタの値をステータスバーの高さと同じNEGATIVEの量だけ変更します(使用している場合はiOS 6プレビューの変更に注意してください)。 enter image description here

代替案:

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

この代替手段のマイナス面は(自動回転の互換性を考えれば無視できるかもしれませんが)、Storyboard for iOS 6を見ている場合、この追加のビューはすぐには表示されないということです。ストーリーボードの「ドキュメントの概要」.

17
svrs

View Controllerをステータスバー(およびナビゲーションバー)と重ならないようにするには、 Interface Builder in Xcode 5の[Edge Bars Under Edges]ボックスのチェックを外します。

Uncheck the Extend Edges Under Top Bars

12
nvrtd frst

アップルはテクニカルQ&AをリリースしましたQA1797:ステータスバーがあなたの意見を隠してしまうのを防ぎます。それはiOS 6とiOS 7バージョンのためにうまく働きます。

11
Igor

私はこの厄介な問題を解決するためにたくさんのたくさんのたくさんのそしてたくさんのチュートリアルを見ました。しかし、どれもうまくいきません。これが私の解決策です、そしてそれは私のために働きます:

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のステータスバーが嫌いです! 〜 "〜

8
firestoke

Archy Holtの答えに代わる、もう少し簡単な方法があります。

a。 info.plistでUIViewControllerBasedStatusBarAppearanceNOに設定します。

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をサブクラス化することを検討することもできます。

6
Cœur

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

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

    [super viewDidLoad];
}
5
IgniteCoders

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

ステップ1 :1つのviewControllerに変更する

[[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleBlackOpaque];

ステップ2 :アプリケーション全体で変更する

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

ステップ3 :それぞれのviewWillAppearにこれを追加してiOS7statusbarの高さを調整する

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

私は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"];
3
Desert Rose

オフセットの問題を解決することを目的としたiOS 6/7 Deltaプロパティを呼び出すInterface Builderにはオプションがあります。

Stack Overflow questionでそれを見てみましょう。Interface Builder:UIViewのLayout iOS 6/7 Deltasとは何ですか?

3

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

2
thebman

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

ユーティリティクラスでユーティリティメソッドを書いて、すべての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];
}
2
Selvin

私の解決策は、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]だけです。

2
Alexandre OS

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

最新のXcodeに古いSDKをインストールするにはどうすればいいですか?

  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. あなたのプロジェクトのビルド設定でUが古いSDKを選択できるようになりました

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

1
marcelosalloum

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

まず第一に - >あなたの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;
   }
1
Vizllx

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アニメーションに対する強力な回避策があります。

1
Cœur

これは共有するには遅すぎるかもしれませんが、私は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

0
channi

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
Tomer Even

私の非常に簡単な解決策は(あなたが垂直方向のみをサポートしていると仮定して)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];
}
0
jki

ステータスバーをまとめて非表示にすることができます。だからあなたのアプリはフルスクリーンになります。私はそれがあなたが得るだろう最高だと思います。

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

0
Christopher Rex

IOS 7のステータスバーを隠すには:

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

2.And Set、View Controllerベースのステータスバーの外観:ブールNO

私はステータスバーの問題を解決したい.....

0
chandrika

私がここで見つけたのは、iOS7でのこのナビゲーションバーの問題に対する最良の代替案と解決策です。

http://www.appcoda.com/customize-navigation-status-bar-ios-7/ /

私たちのすべての質問と心配が解消されることを願っています。

0
simbesi.com