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


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

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

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

書き方(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