iOS 7でUINavigationBarがビューのトップをカバーしないようにするにはどうすればよいですか?


99

Xcode 5に更新した後、アプリのすべてのビューのナビゲーションバーが下に移動しました。ここにいくつかのスクリーンショットがあります。1つ目はプルダウンされたビューのすべてを示し、2つ目はそのままのすべてを示しています。検索バーは、ナビゲーションバーの場所から開始する必要があります。

すべてのコンテンツ アイドル中のすべてのコンテンツ

誰でも私がこれを修正する方法を知っていますか?

編集:私は以前にこれを試してみました:

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

しかし、それは非常に奇妙な結果をもたらします。

ソリューションの試み

これは、ナビゲーションバーの透明性が原因で表示されているこのビューコントローラーの下に「スライドメニュー」があるためと考えられます。


ここに、この問題の別の解決策があります。stackoverflow.com/a/51491645/10148333
Afonso

回答:


234

ナビゲーションバーの半透明プロパティをNOに設定します

self.navigationController.navigationBar.translucent = NO;

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

ナビゲーションバーの表示と非表示を切り替える必要がある場合は、

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

あなたのviewDidLoad方法で。


1
これを下に配置viewDidLoadしましたが、変更はありません。
Sam D20 2013

13
viewDidLayoutSubviews関数で作成
ヒンドゥー教

1
これをviewDidLayoutSubviewsに追加するとうまくいきます。紳士の助けに感謝します!
サムD20 2013

こんにちは、何か質問はありますか?それともお世辞ですか?
2013

1
self.edgesForExtendedLayout = UIRectEdgeNone; 助けてくれました
ルーキー

32

ではiOS 7、デフォルトにより、すべてのコントローラの半透明のプロパティの値がYESである、あなたはNO半透明のプロパティを設定するので、この問題のために。

self.navController.navigationBar.translucent = NO;

2
「navController」プロパティはありません。これを使用してください:self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan、2016年

アプリのデリゲートにnavigtionbarcontrollerオブジェクトを作成し、navControllerという名前を付けます。
Sumit Mundra 2016年

21

この画面のビューコントローラーの属性インスペクターで「エッジの延長」を無効にすることができます(下の画像を参照)。

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


12

これはiOS 8.1でも迅速に機能します

navigationController?.navigationBar.translucent = false

8

の半透明性を維持したい場合navigationBarは、の最後viewDidLoadまたはに次viewWillAppearのコード行を追加します。

[self.view sendSubviewToBack:self.tableView]

あなたの場合はどういうわけかscrollView、サブクラス(UITableViewUICollectionViewなど)であるindex、あなたの現在のビューでは0 subviews、それが自動的に応じてインセットを調整しますnavigationBar。また、iOS7より前のバージョンのUIにも影響はありません。


編集UITableViewプログラムで 初期化する場合は、これを使用してビューに追加することをお勧めします[self.view insertSubview:self.tableView atIndex:0];


これが正解です。プログラムでサブビューを追加する場合は、追加した後、サブビューを[self.view insertSubview:self.tableView atIndex:0];背面に送る代わりに行うことができます。
smitt0​​4 2014年

正しい。しかし、彼が自分のコントローラー(プログラム的には、インターフェイスビルダー)をどのように起動しているかがわからなければ、それが最良のソリューションであるとは言えません。私は私の答えを編集しましたが。
jbouaziz 2014

これは機能しますが、ハックのように見えます。これに関する公式文書に何か通知はありますか?
John Tracid、2015

4

Swift 4

viewDidLoadメソッドで次のコード行を設定します。

self.navigationController?.navigationBar.isTranslucent = false

3

次のURLに示すように、このメソッドをビューコントローラに追加できます

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

別のアプローチはself.automaticallyAdjustsScrollViewInsets = YES;、ビューコントローラーを設定することです。これはデフォルトで有効になっています。しかし、あなたの場合:

EGORefreshHeaderViewを使用しているようです。UITableViewのcontentInsetで遊ぶ。したがって、リリースすると、ヘッダーは前の値を復元するのではなく、上部インセットをリセットします。


-1

ビューを完全に制御し、iOSの誤った調整を回避したい場合は、UITableViewをサブクラス化し、-(void)willMoveToWindow:(UIWindow *)newWindowでインセット(スクロールとインジケーターの両方)を調整します。私のために働く。


-4

別のオプションは、Info.plistファイルをソースコードモードで開き、次の情報を入力することです。

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

お役に立てれば。


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