タコさんブログ

プログラミングメモと小言

カスタム画面遷移でモーダル表示をしたとき、dismissしたら画面が無くなっている!?

環境

現象

プログラムの内容:カスタム画面遷移でモーダル画面を表示させて、モーダル画面内のボタンが押されたら dismissViewControllerAnimated でカスタム画面遷移でモーダル画面を閉じる。

これをしたら、こんな感じです。

f:id:tiny_wing:20150607214006g:plain

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)
          })
}

これで下のように表示されるようになりました。

f:id:tiny_wing:20150607220210g:plain

今回のフルソースはこちらにあります。