在WWDC 2017 SceneKit会话中,他们建议使用overlaySKScene在SceneKit上为HUD等覆盖SpriteKit图层。在旋转iPhone / iPad之前,它似乎工作正常。现在,SpriteKit中的文本全部被拉伸(如果从纵向转为横向)或缩小(如果从横向转为纵向)。无论如何,无论方向如何,都要保持文本或图形的大小相同吗?
sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)
我以一种非常简单的方式解决了这个问题。只需调整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)
...
}
希望这有助于其他人面临类似问题。
答案 0 :(得分:4)
您需要了解SKScene的工作原理:
这意味着将叠加层设置为给定方向的iphone屏幕大小:
sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)
现在我假设没有其他任何更改,这意味着您的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
,我需要创建一个resize方法,该方法在方向被翻转时遵循,并按照新大小的比例移动节点。
您可以使用
检测方向何时翻转ViewController
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
然后使用视图进入场景调用调整大小函数/加载新场景。