ナビゲーションバーを透明にしようとして、
isTranslucentをtrueにして、
その後にまた不透明に戻そうと思ったので
falseにしたら、
なんか画面に配置してるものがズレ出した、なんだこれ…!
って時や、

iOSのバージョンなどによって
ナビゲーションバー分くらいオブジェクトがズレちゃう…!
って時のメモです。

ずれる理由を確認してみた

<isTranslucent関係でズレてる時:isTranslucentって何だ>

UINavigationController.navigationBar.isTranslucent
は、ナビゲーションバーを半透明にするかどうか、という事を設定できるようです。
(参考:公式

trueにすると、ナビゲーションバーを半透明にする。
falseにすると、ナビゲーションバーを半透明にしない。

そこまではいいのですが、
どうやらこの値をfalseにすると、
「ナビゲーションバーの線画範囲を、ナビゲーションバーの下まで下げる」という設定に
自動的になるようでした。

つまり、
falseにしたら
ナビゲーションバー分だけ下にずれるようになっちゃう
って感じのような気がします。

<isTranslucentよ、なんでずらしちゃうの!>

なんでそんな設定になっているのかなぁ…と色々見ていると…

ナビゲーションバーが表示されている時(falseの時)は、
ナビゲーションバーの裏にオブジェクトが隠れてしまわないように
画面全体を下にちょっとずらすようです(ナビゲーションバーの高さ分だけ下にずらす)。

そして、ナビゲーションバーが表示されていない時(trueの時)は、
ナビゲーションバーが無くてオブジェクトが隠れてしまう事もないから、
画面の一番上から配置できるようになるようでした。

<iOS11からずれるようになった事もあった>

少し前の話になりますが、iOS11が出た時から、ずれるようになった事もあるようです。
(adjustedContentInsetなどの関係)

【対策】ズレを防ぐ方法

状況によって対処方法は違うので、いくつか書いていきます。
※ずれた時の対処方法のまとめというよりは、私が実際にやってみた時のメモ書きになっていますので、詳しい内容などは調べながらご使用いただけると嬉しいです。

<extendedLayoutIncludesOpaqueBarsを使う>

self.navigationController?.navigationBar.isTranslucent = false

とするタイミングで、画面が下にズレてしまうようになった場合は、
その後に

extendedLayoutIncludesOpaqueBars = true

と書けばいいようでした。
(こうすることで、ナビゲーションバーの上から(つまり、画面の一番上から)オブジェクトが配置できるようです)

automaticallyAdjustsScrollViewInsetsを使う>

iOS11の場合は、
self.automaticallyAdjustsScrollViewInsets = false
を入れると、下にずれてしまったオブジェクトを上にずらせるようです。

edgesForExtendedLayoutwを使う>

これは私が過去に設定していて、それを忘れていたためにズレてしまった箇所なんですが…
以前、こんな記述を付け加えていたのですが、

self.edgesForExtendedLayout = UIRectEdge()

ここをコメントアウトしたとこと、ズレがなくなりました。
extendedLayoutIncludesOpaqueBarsや、automaticallyAdjustsScrollViewInsetsを変更してみたけれど変化がない、という時は試してみてください…。

スポンサーリンク