SKView&SKSceneを画面の回転に対応させる

iOSバイスを回転させたときに、SpriteKitで使うSKViewSKSceneをどうやって・どのタイミングで追従させるかについてです。

SpriteKitの中で完結させようとなると、SKSceneが持つdidChangeSize(CGSize)メソッドを使うべきなのでしょう。しかしこのメソッドはサブクラスでオーバーライドしてあげないと使えず、デリゲートで外から制御させることができません。回転のためだけにオレオレスーパーSKSceneを作るのもなんだかなあと調べていたら、UIViewControllerviewWillTransition(to:with:)を使う方法がStackOverflowで紹介されていて便利だったのでこちらでも紹介します。

stackoverflow.com

Swiftで書くとしたら次のようになります。

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    // SKViewの調整 (※AutoLayout設定済みなら不要)
    skView.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height)
    // SKSceneのサイズをSKViewに合わせる
    currentScene.size = size

    // 新しい画面サイズで修正が必要な処理の実行
}

viewWillTransition(to:with:)もサブクラスでオーバーライドして使うものとはいえ、ビューコントローラはたいていサブクラスで運用しているので、ずっと気軽に使えます。