カスタム画面遷移でモーダル表示をしたとき、dismissしたら画面が無くなっている!?
環境
現象
プログラムの内容:カスタム画面遷移でモーダル画面を表示させて、モーダル画面内のボタンが押されたら dismissViewControllerAnimated でカスタム画面遷移でモーダル画面を閉じる。
これをしたら、こんな感じです。
dismissを押して、モーダル画面を閉じたら、遷移後の画面に何も表示されていません。 なぜや!!
バグか?
いつも通りググったら、ここに辿り着きました。
I was having the same problem here – looks like a bug in iOS 8
iOS 8のバグらしい。 UIWindowのビュー階層が完全に空になっている。
Open Radarにもバグとして報告してあるようだ。
回避策
これを回避するには animateTransitionメソッドのアニメーション終了後に、 toViewController.view をkeyWindowにaddSubviewする。
今回のコード的には下のようにする。
@objc func animateTransition(transitionContext: UIViewControllerContextTransitioning) { // From ViewController let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) // To ViewController let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let fromView = fromVC!.view let toView = toVC!.view // アニメーションを実行するためのコンテナビューを取得 let containerView = transitionContext.containerView() containerView.insertSubview(toView, belowSubview: fromView) UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: .CurveLinear, animations: { fromView.transform = CGAffineTransformMakeScale(0.5, 0.5) }, completion: {(finished: Bool) in let completed = !transitionContext.transitionWasCancelled() transitionContext.completeTransition(completed) // これを追加!!! UIApplication.sharedApplication().keyWindow!.addSubview(toView) }) }
これで下のように表示されるようになりました。
今回のフルソースはこちらにあります。