Posted at

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

More than 1 year has 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