Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

よく、前の画面を表示したまま透過した画面を表示したいといったケースがあるかと思います。(ダイアログとか)
通常は 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の仕組みを追うと当然の結果なのかもしれませんが、それは割愛。。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away