概要
よく、前の画面を表示したまま透過した画面を表示したいといったケースがあるかと思います。(ダイアログとか)
通常は 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)
青が遷移先の画面です。
タブバーが表示されています。
navigationControllerにpresentした場合
let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(controller!, animated: true, completion: nil)
self
と同じく、タブバーが表示されています。
tabBarControllerにpresnetした場合
let controller = self.storyboard?.instantiateViewController(withIdentifier: "sec")
controller?.modalPresentationStyle = .overCurrentContext
self.tabBarController?.present(controller!, animated: true, completion: nil)
タブバーが表示されません。
まとめ
よくある、背景透過のダイアログを作りたい場合、タブバーは表示されて欲しくないので必然的に hidesBottomBarWhenPushed
を使用してタブバーを明示的に隠す、またはtabBarController
から遷移させて上げる必要がありそうです。
きっとNavigationControllerやTabBarControllerの仕組みを追うと当然の結果なのかもしれませんが、それは割愛。。