コンテナビューを持つ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 |
| |
+---------------------------------+
追伸私の見解はこれよりも複雑で、単純化しています。
ここで欠けているのは、半透明のNavigation BarがViewControllerのビューの上にあるのに対し、半透明でないNavigation BarがView Controllerのビューを押し下げることです(効果的にサイズを変更します)。
そのため、ここで起こっているのは、半透明のナビゲーションバーでは、空白が実際にバーの下に隠れているのに対して、バーが半透明でない場合は「押し下げられ」ます。
これを実行する方法はいくつかありますが、主に自動レイアウトを使用しているかどうかによって異なります。
-viewDidLoad
に次のコード行を追加して、この問題を修正しました。
self.extendedLayoutIncludesOpaqueBars = YES;
ストーリーボードでこの問題が発生する場合(コードの半透明のプロパティに触れることなく)、NavigationBarの設定と(必要に応じて)ストーリーボードのソースファイルを確認すると便利です。
(これはこの質問には完全には当てはまりませんが、問題を検索すると、基本的にこの質問のみがポップアップ表示され、情報は同じ問題を持つ他の人に役立つかもしれません。)
詳細:
ストーリーボードエディタのナビゲーションバーにアクセスするには:ドキュメントアウトラインを表示(メニューエディタ->ドキュメントアウトラインを表示)して、ナビゲーションバーを選択します。
次に、属性インスペクタの右側にあるユーティリティペインで、[Translucent]がオフになっていることを確認します。
それでも解決しない場合は、TextEditでストーリーボードファイルを開き、navigationBar
要素を探して、opaque
またはtranslucent
属性を確認します。 translucent="NO"
。
(ストーリーボードのソースを開くには、プロジェクトナビゲーターのXcodeでストーリーボードファイルを右クリックします。[Finderで表示]を選択し、Finderウィンドウでファイルを右クリックして[...で開く]を選択し、TextEditを選択します。)
編集:(いつもあったかどうかはわかりませんが、プロジェクトナビゲーターでストーリーボードファイルを右クリックして[名前を付けて開く]-> [ソースコード]を選択できます。Finderに移動する必要はありません。 )
IBに移動してこの問題を修正し、ビューを選択して、[スクロールバーのインセットを調整]の選択を解除します
IOS 7.0の時点で、すべてのビューはナビゲーションバー、ツールバー、タブバーの後ろに自動的に移動して、Appleが「コンテキスト」と呼びます。ガラス効果)を使用すると、画面外に他に何があるのかをユーザーに知らせることができます。
これが邪魔になる場合(そして、正直なところ驚くほど頻繁に邪魔になる場合)、そのedgesForExtendedLayoutプロパティを変更することで、特定のView Controllerに対して簡単に無効にすることができます。
たとえば、View Controllerをバーの後ろに配置したくない場合は、次を使用します。
edgesForExtendedLayout = []
IOS 7.0から利用可能
これは純粋に自動レイアウトの問題のためです。開始時にいくつかのビューを非表示にし、すべてのビューを表示してスペースがまだあるかどうかを確認している可能性があります