新しいiOS7 SDKでは、ナビゲーションバーがビューの上に表示されます


113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

以前のバージョンでは正常に動作しています。検索バーはstatusbar、ナビゲーションバーの下に表示されます。tableview検索バーの下に表示されています

しかし、これをで実行するXcode 5 sdk iOS 7と、検索バーは表示されず(ステータスバーとナビゲーションバーの下に配置されていると思います)、ナビゲーションバーもテーブルビューの上に表示されます。

iOS 7安定版リリースで修正されますか?

それとも私のコーディングの問題ですか?

または、y (y = statubar height + nav bar height)値を追加して処理する必要がありiOS 7ますか?

最近、Xcode 5 DPをダウンロードしてiOS 7でアプリをテストしました。最初に気づき、確認したのは、ステータスバーとナビゲーションバーを考慮してビューの境界が常にサイズ変更されるとは限らないことです。

viewDidLayoutSubviewsで、ビューの境界を印刷します。

{{0, 0}, {320, 568}}

これにより、コンテンツがナビゲーションバーとステータスバーの下に表示されます。

メイン画面の高さを取得し、ステータスバーの高さとナビゲーションバーの高さを差し引いて、自分で高さを計算できることはわかっていますが、これは不要な余分な作業のようです。

他の誰かがこの問題を経験しましたか?

更新:

この特定の問題の解決策を見つけました。ナビゲーションバーの半透明プロパティをNOに設定します。

self.navigationController.navigationBar.translucent = NO;

これにより、ビューがナビゲーションバーとステータスバーの下にフレーム化されなくなります。

ただし、ナビゲーションバーを半透明にしたい場合の解決策は見つかりませんでした。たとえば、写真を全画面で表示する場合、ナビゲーションバーを半透明にして、ビューをその下にフレーム化します。それは機能しますが、ナビゲーションバーの表示/非表示を切り替えると、さらに奇妙な結果が発生しました。最初のサブビュー(a UIScrollView)は、境界yの原点が毎回変更されます。


4
ベータ版ソフトウェア。Apple開発者フォーラムはより適切です。また、問題は移行ガイドで明示的に言及されています。
スルタン2013

回答:


188

それは完全に真実ではありません。iOS 7には、以前のバージョンのiOSと同様にレイアウト動作を調整できる新しいプロパティが導入されています。このコードをビューコントローラーに配置すれば、準備完了です。ナビゲーションバーが占めるスペースは、自動的に考慮されます。

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

-(void)viewDidLoadメソッドに上記を追加する必要があります。

注:APIがベータ版から変更されたため、iOS 7およびXcode 5の最新のGMリリースを使用する必要があります。


私のコードでは、edgesForExtendedLayoutと表示されています。宣言されていない識別子UIExtendedEdgeNoneの使用。助けてください。

6
UIRectEdgeNone
Simon

6
これこそが、そのような質問をここで尋ねたり答えたりしてはならない理由です。
スルタン2013

あなたはios6との互換性を維持したい場合は、コントローラは、その性質を持っているかいないかどうかを確認するために、コードによる条件ケースを導入することを余儀なくされているなぜ私は.. undestandしません
jerrygdm

12
これは、ビューがUINavigationControllerに埋め込まれている場合にのみ機能するようです。
pojo 2013

37

ストーリーボードのスクリーンショット

ストーリーボードで作業している場合(これを強くお勧めします!)、これが解決策 です。ストーリーボードでViewControllerの "エッジの拡張"を無効にできます。ビューコントローラーごとにこれを行う必要があります。stortyboardの(ビュー自体の下にあるproductOwnerの横にある)viewControllerアイコンをクリックし、(画像のように)属性インスペクターを選択して、拡張エッジを無効にできます。

これにより、iOS 6のように整列線も設定されます。

xCode 5のもう1つの優れたツールは「プレビュー」です。執事ボタン(アシスタントエディター)をクリックして[プレビュー]を選択します。そこで、iOS 6を選択して、ストーリーボードのデザインがiOS 6でどのように表示されるかを確認できます。

そのちょうど素晴らしい:D

[更新]

注意:「エッジの延長」を無効にすると、iOS7でアプリが背景に入ると、ナビゲーションバーが黒く光る場合があります。グローはマルチタスクビューにも表示されます(ホームボタンを2回押します)。これは、ナビゲーションのバービューの背景色を白に設定することで解決できます。

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];

うん、これはストーリーボードの観点から見たソリューションです。ありがとうございました。
jpittman 2014

12

OPが言うように、ナビゲーションバーを不透明に設定するという簡単な解決策があります。これをコードで行うのではなく、ルートナビゲーションバーの「半透明」のチェックを外します。

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


8

self.edgesForExtendedLayout=UIRectEdgeNone;

iOS 7シミュレーターで動作します(Xcode 5 DP5)


2
これはios7では正常に機能しますが、iOS 6以前でアプリを実行すると、ビューが上に移動します。これに対する解決策はありますか?また、各ビューコントローラーのviewdidロードメソッドでこのプロパティを設定する必要がありますか?
Loganathan 2013

:現在のiOSはこれで7であればあればいつでも確認することができますif (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Avielグロス

2

これらの回答、特にMQoderの回答はすべて役に立ちましたが、私にとっても、デフォルトのトップバーを「不透明な黒いナビゲーション」に設定する必要がありました。

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


1

@One Man Crewの答えは正しいですが、

古いバージョンでアプリを実行するときのエラーを回避するために、このコードを使用することをお勧めします。

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif

0

self.edgesForExtendedLayout = UIRectEdgeNone;

そして、あなたはAppDelegate#application:didFinishLaunchingWithOptionsでこれを行う必要があります:

self.window.backgroundColor = [UIColor whiteColor];

そうしないと、ナビゲーションバーの背景色が灰色に変わります。透明なナビゲーションバーがウィンドウに重なっているためです。


0

ユーザーがテーブルビューをスクロールしたときに透明度を維持したい場合は、そのcontentInsetを設定できます。

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);

-1

1つの解決策は、Navigation Controllerを使用することです。これは自動的に問題を解決します。また、これらはベータ版であるため、Xcodeプレビューバージョンの代わりにXcode 5を使用してください。

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