SpriteKit场景不适合iPhone X上的整个视图

Tom*_*hen 8 iphone ios sprite-kit

iPhone X几天前发布.我正在尝试将我的一个游戏更新到新手机.但是,在具有SpriteKit场景的一个场景中,场景不会缩放以填充整个屏幕.

以下是显示场景的代码:

GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"];
scene.scaleMode = SKSceneScaleModeFill;
// skView is basically self.view casted to SKView
[skView presentScene:scene];
Run Code Online (Sandbox Code Playgroud)

SKS文件中场景的大小为2048x1536.

这就是它的样子:

图片

红色部分是场景内容.一个有趣的事情是,背景(蓝色和灰色,确实正确显示).

有任何解决这个问题的方法吗?我只是拉伸场景来填充显示器(没有任何东西被圆角和凹口覆盖)

bal*_*630 1

SpriteKit 游戏可能有一种更简洁的方法来支持 iPhone X 屏幕,但我为 SKView 提供了以下扩展:

public extension SKView {
    func isIphoneX() -> Bool {
        let screenHeight = 2436.0
        let screenWidth = 1125.0
        let iphoneXAspectRatio = screenHeight / screenWidth

        let aspectRatio = Double(self.frame.width/self.frame.height)
        return (aspectRatio == iphoneXAspectRatio) ? true : false
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:基本上它根据屏幕的宽高比设置缩放模式。如果是 iPhone X 宽高比,请将缩放模式设置为“resizeFill”,否则对于经典矩形 iPhone 和 iPad 屏幕,请使用“aspectFill”模式。

import SpriteKit

class GameViewController: UIViewController {

    // MARK: - View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        guard let view = self.view as? SKView else { return }
        guard let scene = SKScene(fileNamed: "sceneName") else { return }
        scene.scaleMode = view.isIphoneX() ? .resizeFill : .aspectFill

        view.presentScene(scene)
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现 resizeFill 模式是使内容填满整个 iPhone X 屏幕而不扭曲或剪切场景内容的唯一方法。如果游戏中有 HUD 节点(得分、计数器、按钮等...),您也需要对其进行更改!

override func didMove(to view: SKView) {
   // Any additional setup... 
   ...

    if view.isIPhoneX {
        hud = SKReferenceNode(fileNamed: "yourIPhoneXHUDScene")
    } else {
        hud = SKReferenceNode(fileNamed: "yourStandardHUDScene")
    }

    cam.addChild(hud)
}
Run Code Online (Sandbox Code Playgroud)

在模拟器中对每种 iPhone 屏幕尺寸(3.5"、4"、4.7"、5.5"、5.8")进行了测试。但是我不确定如何处理 Xcode 中设置的视网膜 iPad 尺寸(2048 x 1536)的游戏场景。