ナビゲーションバーを透明にしようとして、
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を変更してみたけれど変化がない、という時は試してみてください…。