web-dev-qa-db-ja.com

iOS 7では、ビューの境界の上にステータスバーが表示されます

IOS 7でアプリをテストしようとすると、ステータスバーにビューが表示されます...読んだように、iOS 7ではステータスバーが非表示になっています。では、iOS 6とiOS 7の両方で実行できるように互換性を持たせるにはどうすればよいですか?画面ごとにiOSバージョンごとに異なる.xibファイルを作成する必要がありますか?

私はこれを読んでいます:標準アプリの両方のバージョンが同様のレイアウトを持つ必要がある場合、自動レイアウトを使用して、iOSの両方のバージョンで正しく動作するUIを作成します。 iOSの複数のバージョンをサポートするには、ストーリーボードまたはXIBファイルのビューとコントロールを調整するために自動レイアウトが使用できる単一の制約セットを指定します(制約の詳細については、「ビュー間の制約エクスプレスリレーションシップ」を参照してください)。

標準アプリの両方のバージョンが同様のレイアウトを持つ必要があり、自動レイアウトを使用していない場合は、オフセットを使用します。オフセットを使用するには、まずiOS 7のUIを更新します。次に、以前のUIの各要素の原点、高さ、幅を、iOS 7 UIの要素の新しい位置からのオフセットとして定義する値を指定します。

しかし、.xibで自動レイアウトを使用すると、自動レイアウトがiOS 6より前のバージョンにあるというエラーが表示されます。

この問題を修正するにはどうすればよいですか?

32
Bhrigesh

iOS 7は、一部のビューではステータスバーを非表示にし、他のビューでは非表示にしないようです。すべてのビューで非表示にするには、次を実行します。

  1. 以前のOSバージョンをサポートするには、Hide during application launchがまだチェックされていることを確認してください。
  2. Info.plistファイルで、View controller-based status bar appearanceを追加し、NOに設定します。
  3. ビルドする前に「きれいにする」必要があるかもしれませんが(そうしました)、アプリは以前と同じように動作するはずです。
37
Nerrolken

おそらく、各View Controllerに次のコードを追加する必要があります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
    {
        [self prefersStatusBarHidden];
        [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    }
    else
    {
        // iOS 6
        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
    }
}

// Add this method
- (BOOL)prefersStatusBarHidden {
    return YES;
}
24
NIKHIL

同じ問題があります。今のところ、2つのハックを行い、どちらに進むかを決定します。

  • UIStatusBarHiddenおよびUIViewControllerBasedStatusBarAppearanceをtrueに設定すると、ステータスバーを完全に非表示にできます。
  • 私のアプリでは、値0のTop Spacing制約を作成し、iOS 7でアプリが実行されていることを検出した場合、プログラムで20に変更します。

ステータスバー領域の自動レイアウトアカウントを作成するにはどうすればよいですか?


さて、私はそれを理解しました。

サブビュー(私の場合はBRSMyListSubViewController)、viewDidLoadで、これら2つのいずれかを設定する必要があります

self.edgesForExtendedLayout = UIRectEdgeNone;
self.automaticallyAdjustsScrollViewInsets = NO;

OR

self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

興味深いことに、ルートView Controllerでは、これらの値はそれぞれデフォルトのUIRectEdgeAllNO、およびYESに設定されていますが、tableViewはnavbarおよびフッター。

なぜそんなに非論理的であるのか分かりません。

edgesForExtendedLayoutがふるまいの原因であることは明らかですが、他の2つのプロパティのいずれかと混合する必要があることも奇妙です。

9
expert

IOS 7で Xcode 5を使用してステータスバーを表示する場合は、ボタンと他のサブビューを再配置して、ステータスバーの周囲に十分なスペースを確保します。しかし、待ってください! iOS 6もサポートしたい。それ、どうやったら出来るの?

Appleのドキュメント を見つけ、ドキュメントに「Supporting Two Versions of a Standard App」というタイトルを見つけました。

XIBファイル を編集している場合は、それを選択してアシスタントエディターをクリックします。そこに「マニュアル、自動...」メニューがあります。次に、「プレビュー」を選択します。

Enter image description here

次に、ビューレイアウトが並んでいます。次に、右ペイン(ビュー)の右下にポップアップボタンがあることに気付くでしょう。 「iOS 7以降」と表示されます。 「iOS 6.1以前」を選択できます。わあ! iOS 7のレイアウトに影響を与えることなく、iOS 6.1の調整を行えるようになりました。

Enter image description here

ストーリーボードで作業している場合、基本的に同じです。 View Controllerオブジェクトを選択し、アシスタントエディタモードをクリックして、「プレビュー」、「iOS7以降」の順に選択します... Bluh Bluh Bluh。

よくわかりませんが、アシスタントエディターのみがiOS 7 +/iOS 6-モードに切り替えることができます。つい最近発見したので、誤解やその他のトリックがある場合は指摘してください。

8
Kaz Yoshikawa

マルチxibを構築する必要はありません。あなたの問題は「20px」だと思います:同じXIBファイルはiOS 6で見栄えが良いのですが、iOS 7では20ピクセルを見逃しています。

たとえば、ビューがあり、Y = 0です。iOS6では、ステータスバーの下部にあります。 iOS 7では、ステータスバーの上に表示されます。

Xcode 5を使用してXIBファイルを開き、アシスタントエディターを有効にする必要があります。次の手順を実行します:

  1. ファイルインスペクターを選択し、「表示形式」を「iOS 7以降」に切り替えます

  2. サイズインスペクターを選択し、deltaYに「-20」を入力します

  3. 終わった!

3
DongXu

IOS 7.0以降およびiOS 6.0以下のメインUIViewサイズを確認する必要があるのは一度だけです。

IOS 7からAppleはメインビューサイズを変更しました=修正済みです。ナビゲーションバー、タブバーを追加した場合、ビューサイズは同じままです[iPhone 4s:320 * 480、iPhone 5:320 * 568]。

0
imDeveloper