2017-07-19 5 views
3

In der WWDC 2017 SceneKit-Sitzung empfehlen sie overlaySKScene zu verwenden, um eine SpriteKit-Ebene über SceneKit für HUD usw. zu überlagern. Es scheint gut zu funktionieren, bis ich das iPhone/iPad rotiere. Jetzt wurde der Text in SpriteKit alle gestreckt (wenn Sie von Hochformat zu Querformat wechseln) oder verkleinert (wenn Sie von Querformat zu Hochformat wechseln). Gibt es trotzdem einen Text oder eine Grafik in gleicher Größe, unabhängig von der Ausrichtung?Wie verhindert man, dass SpriteKit Overlay im SceneKit dehnt?

sceneView.overlaySKScene = SKScene(size: sceneView.frame.size) 

Ich löste das Problem auf sehr einfache Weise. Ändern Sie einfach die Größe der OverlaySKScene und positionieren Sie alles in

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) 
    ... 
} 

Hoffen, dass dies hilft anderen mit ähnlichen Problem konfrontiert.

Antwort

3

Sie müssen prüfen, wie SKScene funktioniert:

Dies die Overlay Größe des iPhone-Bildschirm für die gegebene Orientierung gesetzt bedeutet: sceneView.overlaySKScene = SKScene(size: sceneView.frame.size)

Jetzt habe ich nichts andere Änderungen ginge davon aus, so dass Mittel Ihr scaleMode ist auf .fill eingestellt, was bedeutet, dass die Grafiken streckbar sind, bis alle Seiten ausgefüllt sind.

Wenn Sie im Hochformat sitzen, werden Sie nichts bemerken, weil es im Maßstab 1: 1 ist.

Jetzt kippen Sie es in die Landschaft.

Das System wird versuchen, Ihre Hochformat-Bildschirmgröße in eine Querformatgröße zu konvertieren.

Dies bedeutet, dass Sie Fett Stubby Grafiken bekommen, weil es Ihre Seiten ausstrecken wird, und verkleinern Sie Ihre oberen und unteren Rand, um alle Kanten zu füllen.

Dies ist der Grund, warum Code wie sceneView.overlaySKScene = SKScene(size: sceneView.frame.size) schlecht ist. Du wirst am Ende verwirrt sein.

ich immer empfehlen, entweder eine SKS-Datei oder eine konstante Szenengröße einstellen, so sceneView.overlaySKScene = SKScene(size: CGSize(750,1334))

Dann, je nachdem, wie ich mochte, dass mein Overlay angezeigt werden, ich habe den richtigen Maßstab Modus verwenden.

In Spielen, in denen ich das Overlay will den genauen Prozentsatz des Platzes auf dem Bildschirm nehmen, verwende ich .aspectFill

In Spielen, in denen ich das Overlay will die genaue Höhe des Pixelraumes aufzunehmen, verwende ich .resizeFill

Mit Blick auf die scaleMode, weiß ich jetzt, wie meine Szene verhalten soll.

Mit , ich werde erkennen müssen, wenn die Orientierung umgedreht wurde, und zu diesem Zeitpunkt entweder die SKS entsprechend der Ausrichtung präsentieren, oder Knoten entsprechend der Ausrichtung verschieben.

Mit .resizeFill muss ich eine Methode zur Größenänderung erstellen, die bei der Ausrichtung der Ausrichtung beachtet wird, und die Knoten proportional zur neuen Größe verschieben.

Sie können erkennen, wenn Ausrichtung Flips in der ViewController mit

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) 

dann die Ansicht verwenden, um die Szene zu bekommen Resize-Funktion aufrufen/eine neue Szene laden.

Verwandte Themen