如何防止SceneKit中的SpriteKit叠加层拉伸?

Lim*_*ean 3 scenekit sprite-kit swift

在WWDC 2017 SceneKit会话中,他们建议使用overlaySKScene在用于HUD等的SceneKit上覆盖SpriteKit图层。在我旋转iPhone / iPad之前,它似乎工作正常。现在,SpriteKit中的文本全部拉伸(如果从纵向变为横向)或缩小(如果从横向变为纵向)。无论方向如何,是否都可以使文本或图形保持相同的大小?

    sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)
Run Code Online (Sandbox Code Playgroud)

我以非常简单的方式解决了这个问题。只需调整overlaySKScene的大小并重新放置所有内容即可

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    let width = sceneView.frame.height
    let height = sceneView.frame.width

    sceneView.overlaySKScene?.size = CGSize(width:width, height:height)
    ...
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助其他面临类似问题的人。

Kni*_*gon 5

您需要查看SKScene的工作方式:

这意味着将给定方向的叠加层设置为iphone屏幕的大小: sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)

现在,我假设没有其他变化,这意味着将your scaleMode设置为.fill,这意味着将拉伸图形直到所有面都填满。

坐在人像模式时,您不会注意到任何东西,因为它是1:1比例。

现在,您将其翻转为风景。

系统将尝试将您的纵向屏幕尺寸转换为横向尺寸。

这意味着您将获得粗短的图形,因为它将伸展您的侧面,并缩小顶部和底部以填充所有边缘。

这就是为什么做类似代码 sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)是不好的原因。您最终会感到困惑。

我总是建议您使用SKS文件或设置恒定的场景大小,因此 sceneView.overlaySKScene = SKScene(size: CGSize(750,1334))

然后,根据我想如何显示叠加层,我使用适当的缩放模式。

在我想让覆盖层占据屏幕空间确切百分比的游戏中,我使用 .aspectFill

在我想让覆盖层占据确切像素空间量的游戏中,我使用 .resizeFill

通过查看scaleMode,我现在知道我的场景应该如何表现。

使用.aspectFill,我将需要检测方向何时翻转,并且那时要么显示与方向相对应的SKS,要么移动与方向相对应的节点。

使用时.resizeFill,我需要创建一个调整大小的方法,当方向发生翻转时,该方法将遵循该方法,并根据新大小按比例移动节点。

当定位在翻转可以检测ViewController与

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 
Run Code Online (Sandbox Code Playgroud)

然后使用视图到达场景以调用您的调整大小功能/加载新场景。