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)
希望这可以帮助其他面临类似问题的人。
您需要查看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)
然后使用视图到达场景以调用您的调整大小功能/加载新场景。
| 归档时间: |
|
| 查看次数: |
469 次 |
| 最近记录: |