2017年10月31日火曜日

SpriteKit で iPhoneX 対応する方法

概要

過去に iPad 対応しました
今度発売される iPhoneX も対応しなければいけなかったのでその対応方法を紹介します

環境

  • macOS X 10.12.6
  • Xcode 9.0.1 (9A1004)

対応コード

Xcode で Game プロジェクト作成した場合を例に紹介します
デフォルトだと UIViewController を継承した GameViewController があります
そこの viewDidLoad を以下のように変更します

override func viewDidLoad() {
    super.viewDidLoad()
    if let view = self.view as! SKView? {
        // Load the SKScene from 'GameScene.sks'
        if let scene = SKScene(fileNamed: "GameScene") {
            // Set the scale mode to scale to fit the window
            if (UIDevice.current.model.range(of: "iPad") != nil) {
                // iPad の場合
                print("iPad")
                scene.scaleMode = .fill
            } else {
                if (UIScreen.main.nativeBounds.height == 2436.0) {
                    // iPhoneX の場合
                    print("iPhoneX")
                    scene.scaleMode = .aspectFit
                } else {
                    // iPhone の場合
                    print("iPhone")
                    scene.scaleMode = .aspectFill
                }
            }
            view.presentScene(scene)
        }
        view.ignoresSiblingOrder = true
        view.showsFPS = true
        view.showsNodeCount = true
    }
}

ポイントは UIDevice.current.model.rangeUIScreen.main.nativeBounds.height を使う点です

まず UIDevice.current.model.range を使って iPad かどうかを判断します
というのも iPhoneX の場合「iPhone」として認識されるのでまずは iPad かどうか判断する必要があります

次に UIScreen.main.nativeBounds.height で iPhoneX かそうでないかを判断します
高さが 2436.0 が iPhoneX なのでその高さの場合に aspectFit を設定することで画面からはみ出ることなく表示されます

そして最後に iPhoneX 以外のデバイスの場合に aspectFill とします

最後に

SpriteKit で iPhoneX に対応する方法を紹介しました
デバイスのタイプでは判断できないのでサイズを取得して判断する必要があります

UIKit の場合 constraints を使っていれば特に何もしなくても iPhoneX に対応できると思います
SpriteKit には constraints がないのでこのような対応をしなければなりません

執筆時点で iTunesConnect にはすでに iPhoneX 対応版のバイナリをアップロードできるので対応したらすぐにアップロードすると良いと思います
スクリーンショットや AppPreviews も iPhoneX 版をアップロードできます

参考サイト

0 件のコメント:

コメントを投稿