web-dev-qa-db-ja.com

Container ViewがUINavigationBarを持っているかのように押し下げられていますか?

コンテナビューを持つUIViewControllerがあります。このコンテナビューには、UITableViewControllerが含まれています。

UIViewControllerはUINavigationControllerに組み込まれています。色合いの色、バーの色合い、タイトルテキストの属性を変更してNavigationBarを構成しますが、透明度を変更しようとすると問題が発生します。他のすべてのカスタマイズコードを削除して、問題を特定しました。 UIViewControllerの-viewDidLoadでこれを行うたびに:

self.navigationController.navigationBar.translucent = NO;

コンテナビューは、まるでそれがそれ自身のナビゲーションバーを持っているかのように、それ自身の上にいくらかのスペースを追加します。半透明をYESに設定すると、ビューにはすべてが正しく表示されます。これは、半透明をNOに設定した場合にのみ、包含ビューでのみ発生します。

ここに欠けているものはありますか?

含まれているビューで半透明をYESに設定し、非表示に設定しようとしましたが、何も機能しませんでした。どういうわけか、含まれているビューは親のコンテナからプロパティを継承していますか?透過性をNOに設定するたびに、含まれるビューに作成されるこの余分なスペースを回避するにはどうすればよいですか?

半透明度の設定は半透明度にのみ影響し、ビューの位置には影響しないと予想されます。

半透明= YESの場合

+---------------------------------+
|                                 |
|     UINavigationBar             |
|                                 |
+---------------------------------+
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|    UITableViewController        |
|    in a Contained View          |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
+---------------------------------+

半透明= NOの場合

+---------------------------------+
|                                 |
|     UINavigationBar             |
|                                 |
+---------------------------------+
|                                 |
|blank space created on top of view
|                                 |
+---------------------------------+
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|                                 |
|     UITableViewController       |
|     in a Contained View         |
|                                 |
+---------------------------------+

追伸私の見解はこれよりも複雑で、単純化しています。

45
Eric

ここで欠けているのは、半透明のNavigation BarがViewControllerのビューの上にあるのに対し、半透明でないNavigation BarがView Controllerのビューを押し下げることです(効果的にサイズを変更します)。

そのため、ここで起こっているのは、半透明のナビゲーションバーでは、空白が実際にバーの下に隠れているのに対して、バーが半透明でない場合は「押し下げられ」ます。

これを実行する方法はいくつかありますが、主に自動レイアウトを使用しているかどうかによって異なります。

34
micantox

-viewDidLoadに次のコード行を追加して、この問題を修正しました。

self.extendedLayoutIncludesOpaqueBars = YES;
19
qianling

ストーリーボードでこの問題が発生する場合(コードの半透明のプロパティに触れることなく)、NavigationBarの設定と(必要に応じて)ストーリーボードのソースファイルを確認すると便利です。

(これはこの質問には完全には当てはまりませんが、問題を検索すると、基本的にこの質問のみがポップアップ表示され、情報は同じ問題を持つ他の人に役立つかもしれません。)


詳細:

ストーリーボードエディタのナビゲーションバーにアクセスするには:ドキュメントアウトラインを表示(メニューエディタ->ドキュメントアウトラインを表示)して、ナビゲーションバーを選択します。

Navigation Bar in Document Outline

次に、属性インスペクタの右側にあるユーティリティペインで、[Translucent]がオフになっていることを確認します。

Translucent Propterty

それでも解決しない場合は、TextEditでストーリーボードファイルを開き、navigationBar要素を探して、opaqueまたはtranslucent属性を確認します。 translucent="NO"

StoryBoard Source

(ストーリーボードのソースを開くには、プロジェクトナビゲーターのXcodeでストーリーボードファイルを右クリックします。[Finderで表示]を選択し、Finderウィンドウでファイルを右クリックして[...で開く]を選択し、TextEditを選択します。)

編集:(いつもあったかどうかはわかりませんが、プロジェクトナビゲーターでストーリーボードファイルを右クリックして[名前を付けて開く]-> [ソースコード]を選択できます。Finderに移動する必要はありません。 )

16
Rainer Schwarze

IBに移動してこの問題を修正し、ビューを選択して、[スクロールバーのインセットを調整]の選択を解除します

3
Phil Hudson

上記の回答で言及されたものは私にとってはうまくいきませんでした。半透明が[〜#〜] no [〜#〜]myViewControllerこれは、Navigation Controllerに組み込まれています。私のために働いた解決策を以下に示します

  1. Attributes Inspectorに移動
  2. 不透明バーの下にあるチェックボックスをオンにして、「エッジを拡張」を選択します

スクリーンショットが添付されています

enter image description here

Xcode 9を使用しています。

ありがとう

3
Vineeth Joseph

IOS 7.0の時点で、すべてのビューはナビゲーションバー、ツールバー、タブバーの後ろに自動的に移動して、Appleが「コンテキスト」と呼びます。ガラス効果)を使用すると、画面外に他に何があるのか​​をユーザーに知らせることができます。

これが邪魔になる場合(そして、正直なところ驚くほど頻繁に邪魔になる場合)、そのedgesForExtendedLayoutプロパティを変更することで、特定のView Controllerに対して簡単に無効にすることができます。

たとえば、View Controllerをバーの後ろに配置したくない場合は、次を使用します。

edgesForExtendedLayout = []

IOS 7.0から利用可能

ソース

1
brahimm

これは純粋に自動レイアウトの問題のためです。開始時にいくつかのビューを非表示にし、すべてのビューを表示してスペースがまだあるかどうかを確認している可能性があります

0
SHINTO JOSEPH