12 | 12月 | 2012 | HMDT Blog

カテゴリー : 2012年 12月12日

モーダルビューとは何なのか


そもそもの発端は、UIViewControllerをモーダルで表示して、それを半透明にしたかった。ほら、モーダル表示すると、下からシュワンと出てきて、重なって表示されるでしょ。このとき、上のビューを半透明にしたらかっこいいんじゃないか、って思ったんだ。

やってみたら、できなかった。なんか、真っ黒になった。Google先生に聞いてみた。modalPresentationStyleをUIModalPresentationCurrentContextにすればいいよ、っていう記事が見つかる。確かにこれでできた。でも、なんか微妙に動きが怪しい。UIModalPresentationCurrentContextってやつも、何なのか、ドキュメントを読んでも、いまひとつ要領を得ない。

てか、そもそもモーダル表示って何なのよ?addSubview:するのと何が違うの?気になったので、少し調べてみた。モーダル表示を何度も重ねる事のできるサンプルを作った。あるUIViewControllerをモーダル表示して、そいつに対してまたモーダル表示して、ということでモーダルのモーダルのモーダルを実現する。その状態で、ビュー階層を調べてみた。

すると、いくらモーダルを重ねても、ビュー階層に残っているのは、一番上に表示されているUIViewControllerのビューだけだ、ということが分かった。モーダルの下になったコントローラ、つまりpresentViewController:animated:completion:を呼び出した側は、モーダルが表示されたらビュー階層から外れるんだ。知らなかったー。

これで、冒頭の半透明表示がうまくいかない理由が分かった。半透明にはなってたんだけど、下に透けて見えて欲しかったビューが、もう外れてしまっていたんだね。なるほど、納得。

じゃ、modalPresentationStyleをUIModalPresentationCurrentContextにするとどうなるかっていうと、この場合はビューが外れなかった。モーダルを重ねたら、その分すべてのビューが追加されたままになっている。うーむ、なるほど。それはそれで、嫌な事が起きそうだなー。

半透明にしたかったら、自分で制御可能な分、addSubview:した方が安全な気がする。ただその場合、viewWillAppear:とかviewDidAppear:とか、addChildViewController:とかを自前で呼ばないといけない。その変が面倒だし気をつけないといけないところだ。