SKView presentScene 因过渡而失败

SKView presentScene fails with transition

我遇到的问题似乎与此处发布的问题类似:In SpriteKit presentScene Transition, won't work. However, presentScene does,但问题的根源(从一个 VC 切换到另一个)似乎并不存在申请。

这是我的 GameViewController 中的相关代码,它将屏幕分成两个视图:一个 UIView "HUD" - 占据屏幕的前八分之一 - 和一个 SKView "gamePlayView",占据剩余的 space。控制器将首先在 gamePlayView 中呈现一个 MenuScene(这很好用),其中将包含带有选项的按钮,可以玩游戏或转到设置(将来可能会添加选项)。到目前为止,我只是得到了开始按钮,它使用委托调用 GameViewController 的 "startNewRound" 函数。

计划是让 GameViewController 保留对 MenuScene、DiatonicIntervalScene(游戏)和 - 将来 - 一个 SettingsScene 的引用,它将在 gamePlayView 中交换。所有这些都是GameScene类型,它继承自SKScene,除了证明对GameViewController的引用和一些颜色值之外什么都不做。

// Views
var hud: HUD!
var gamePlayView: SKView!

// Scenes
var menuScene: GameScene!
var gamePlayScene: (GameScene & TurnScene)!

override func viewDidLoad() {

    // There's some code here to determine the respective sizes of 
    // the areas and to create and add them

    self.view.addSubview(hud)
    self.view.addSubview(gamePlayView)

    menuScene = MenuScene(size: gamePlayView.frame.size)
    menuScene.gameController = self

    gamePlayScene = DiatonicIntervalScene(size: gamePlayView.frame.size)
    gamePlayScene.gameController = self

    gamePlayView.presentScene(menuScene)
}

func startNewRound() {

    print("BEFORE: gamePlayView.scene.name = \( gamePlayView.scene!.name!)\n")

    loadNewTurn()

    let reveal = SKTransition.reveal(with: .down,
                                     duration: 1)
    gamePlayView.presentScene(gamePlayScene)
    // gamePlayView.presentScene(gamePlayScene, transition: reveal)

    print("AFTER: gamePlayView.scene.name = \(gamePlayView.scene!.name!)")
}

我 运行 遇到的问题是这段代码完全按照我想要的方式工作,除非我尝试添加到 gamePlayView.presentScene 的转换(你可以看到修改后的注释掉"startNewRound()" 中的行)。如果我改用那条线,转换永远不会发生,并且 gamePlayView 的场景 属性 永远不会更新。

没有转换,startNewRound() 中的打印语句打印出:

BEFORE gamePlayView.scene.name = Menu
AFTER gamePlayView.scene.name = GameScene

而如果我使用包含过渡的 presentScene,则输出为

BEFORE gamePlayView.scene.name = Menu
AFTER gamePlayView.scene.name = Menu

和loadNewTurn()没关系,我试过把它注释掉(我什至认为它不会做任何事情)。同样奇怪的是 gamePlayScene 的 didMoveTo() 被调用,尽管转换没有发生并且场景没有出现

这就是我能想到的所有内容,感谢您花时间查看它,如果我遗漏了什么,请告诉我!

更新:我发现如果我替换 gamePlayView 之前的启动器,场景变化和过渡会按计划进行:

gamePlayView = SKView(frame: CGRect(origin: gamePlayAreaOrigin, size: gamePlayAreaSize))
self.view.addSubview(gamePlayView)

与:

gamePlayView = self.view as! SKView

让它占据整个屏幕,所以显然是视图控制器的子视图而不是它 self.view 使得转换不起作用

我偶然发现的解决方案(部分归功于 )是覆盖我的 viewcontroller 的 loadView() 并插入以下行

    self.view = UIView(frame: UIScreen.main.bounds)

这似乎导致其他一切都到位。过渡现在按预期和预期进行,并且 - 到目前为止 - 没有任何意外后果!