overCurrentContextの時のnavigationController、tabbarControllerの振る舞い

概要

よく、前の画面を表示したまま透過した画面を表示したいといったケースがあるかと思います。(ダイアログとか)
通常は self.present(controller!, animated: true, completion: nil) と書くことが多いと思いますが、ナビゲーションを持つ場合、タブバーを持つ場合での振る舞いがよくわかっていなかったので整理しました。

selfにpresentした場合

let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.present(controller!, animated: true, completion: nil)

スクリーンショット 2018-03-24 0.32.41.png

青が遷移先の画面です。
タブバーが表示されています。

navigationControllerにpresentした場合

let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(controller!, animated: true, completion: nil)

スクリーンショット 2018-03-24 0.32.41.png

selfと同じく、タブバーが表示されています。

tabBarControllerにpresnetした場合

let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.tabBarController?.present(controller!, animated: true, completion: nil)

スクリーンショット 2018-03-24 0.44.15.png

タブバーが表示されません。

まとめ

よくある、背景透過のダイアログを作りたい場合、タブバーは表示されて欲しくないので必然的に hidesBottomBarWhenPushed を使用してタブバーを明示的に隠す、またはtabBarControllerから遷移させて上げる必要がありそうです。
きっとNavigationControllerやTabBarControllerの仕組みを追うと当然の結果なのかもしれませんが、それは割愛。。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.