将 scaleMode 设置为 resizeFill 时,如何在 didMove(to view: SKView) 中获取 SKScene 的大小?

How can I obtain an SKScene's size in `didMove(to view: SKView)` when setting scaleMode to resizeFill?

我需要 SKScene 的大小来在我的 didMove 方法中进行一些初始计算。当我使用 resizeFill 的 SKSceneScaleMode 案例设置 gameScene 的 scaleMode 时,self.size 值在 gameScene 的 didMove 方法中为 (0, 0)。当我在其他方法(例如 touchesBegan)中查询大小时,值是预期的值(与场景大小匹配的非零值)。只有在呈现场景之前将 gameScene.scalemode 设置为 resizeFill 时才会出现此问题。 SKSceneScaleMode 的任何其他情况都可以正常工作。

这是示例代码

import SpriteKit

class GameViewController: UIViewController {
    override func loadView() {
        self.view = SKView()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        let skView = view as! SKView
        let gameScene = GameScene(size: UIScreen.main.bounds.size)
        gameScene.scaleMode = .resizeFill
        skView.presentScene(gameScene)
    }
}

class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMove(to view: SKView) {
        print(self.size) // self.size == (0,0)
        // ...calculations using self.size
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            print(self.size) // self.size has expected, non-zero valeus
     }
}

我没有使用故事板或 sks 文件。这是 appDelegate 的样子

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow()
        window?.makeKeyAndVisible()
        let gameViewController = GameViewController()
        window?.rootViewController = gameViewController
        return true
    }
}

您没有打电话给 super.didMove(to:view)。先试试看,如果不行,再做:

override func didMove(to view: SKView) {
    super.didMove(to:view)
    DispatchQueue.main.async{
        print(self.size)
    }
}

这会告诉 GCD 在您的函数结束后不久 运行 这个块。