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

【swift3.0/2.3】よく使う!モーダル表示まとめ【背景透明view】

More than 3 years have passed since last update.

元の画面は見せつつメニューとか何かしらのviewを見せたいことってあるよね

こんな感じのやつ
※スタンプアプリをイメージ

modal_sample.gif

背景を透過させてモーダル表示をすれば良いんだけど、ちょっと注意が必要なのでメモとして残しておく

書き方(iOS8以上、swift2.3)

親からviewを呼び出すとき

let viewController = UIViewController()
viewController.modalPresentationStyle = .OverCurrentContext
viewController.view.backgroundColor = UIColor.clearColor()
presentViewController(viewController, animated: true, completion: nil)

viewを閉じるとき

dismissViewControllerAnimated(true, completion: {
        [presentingViewController] () -> Void in
            // 閉じた時に行いたい処理
            presentingViewController?.viewWillAppear(true)
})

注意点

  • presentViewControllerの前にmodalPresentationStyleとbackgroundColorをセットする
  • OverCurrentContextを使うと親のviewWillDisappearは呼ばれない
  • viewを閉じても親のviewWillAppearは呼ばれない

→要するにviewを閉じても呼び出した時の状態のまま親viewに戻る

上記は、閉じた時に親のviewWillAppearを呼ぶようライフサイクルを変更してみてます。
上記のようにしても今のところ不具合は確認できませんでしたが
閉じた時に何か処理をさせたい場合は、処理させたいメソッドを呼び出すようにするといいかも。

おまけ①

modalTransitionStyleを指定すると画面の切り替え方をカッコよくできます!!
分かりやすくまとまってるのでオススメ☆

おまけ②

swift3.0での書き方

親からviewを呼び出すとき

let viewController = UIViewController()
viewController.modalPresentationStyle = .overCurrentContext
viewController.view.backgroundColor = UIColor.clear
present(viewController, animated: true, completion: nil)

viewを閉じるとき

dismiss(animated: true, completion: {
        [presentingViewController] () -> Void in
            // 閉じた時に行いたい処理            
            presentingViewController?.viewWillAppear(true)
})

ちょっと短くなってスッキリ♪

「.OverCurrentContext」が3.0では「.overCurrentContext」になってた。
こんなのなかなか気付かないよねw

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