2016-11-14 5 views
2

Dieses Problem wird mit diesem gebunden: Set SKShapeNode frame to calculateAccumutedFrameResize SKShapeNode Rahmen oder alternative

Gibt es eine Möglichkeit, eine SKShapeNode des Rahmens zu ändern. Ich möchte es nicht skalieren, (hier vorgeschlagen: Resizing a SKShapeNode). Mit der Skalierungsfunktion wird auch der Inhalt verkleinert und verkleinert (die Linienbreite von 200x200 ist sehr verschieden von 50x50).

Ich muss einen Rahmen nehmen und ihn auf eine bestimmte Größe einstellen. Beispiel:

shape.frame = CGRect(...) 

Das geht nicht, da der Rahmen nur get-only ist. Ich habe versucht, calculateAccumulatedFrame zu überschreiben, aber das tut nichts (siehe oberen Link).

Kann jemand bitte eine Alternative zu der gleichen Funktionalität von SKShapeNode vorschlagen, die nicht auf halbem Weg gebaut wurde ... Oder eine Möglichkeit, den Rahmen tatsächlich zu ändern. Die grundlegende Funktionalität, die ich brauche, ist, einen Bogen zu erstellen (in Bildern von Link oben zu sehen) und das in einer Art SKNode haben, so kann ich die Größe, Schrumpfung, etc. die gleiche wie Sie mit SKSpriteNode

+0

Was Beide aktuellen Antworten weisen nicht darauf hin, dass Sie den für einen SKShapeNode verwendeten CGPath ersetzen können. Dies gibt Ihnen eine Art Skalierung. Albtraum, aber möglich. Es gibt keine einfache Möglichkeit, dieses Problem zu lösen. Sie müssen es "fälschen, bis Sie es machen". – Confused

+0

SKShapeNode ist eine halbgebackene Idee. Es ist keine richtige Zeichnung. Es ist die Art von Dingen, die passieren, wenn etwas nicht entworfen wird. – Confused

Antwort

3

SKShapeNode ist ein node basierend auf dem Core Graphics-Pfad (CGPath).

Es gibt also keine direkte Methode der Größenanpassung, die sich von der Skalierung unterscheidet, wie Sie möchten. Wenn Sie beispielsweise eine SKSpriteNode verwenden, haben Sie Aktionen wie resizeByWidth oder resizeToWidth.

Aber über Knoten wie Formen sollten Sie ihn denken, wie Sie eine CGPath oder UIBezierPath mit der Methode like Größe ändern müssen:

apply(_ transform: CGAffineTransform) 

oder direkt bauen Sie Ihren Weg, wie zum Beispiel:

let π:CGFloat = CGFloat(M_PI) 
let startAngle: CGFloat = 3 * π/4 
let endAngle: CGFloat = π/4 
myShape.path = UIBezierPath(arcCenter: CGPoint.zero, radius: 33.5, startAngle: startAngle, endAngle: endAngle, clockwise: true).cgPath 
+0

Dies hilft einige Dinge zu erklären, danke. Ich kann SKSpriteNode jedoch nicht verwenden, da ich die lineWidth bearbeiten muss und wenn ich Form in Textur umwandeln kann, habe ich keine Möglichkeit, die Linienbreite zu ändern. Vielleicht kann ich den Pfad wiederherstellen ... aber weißt du einen Weg, wie ich den wiederhergestellten Pfad animieren kann? Zum Beispiel habe ich einen, der 200 Radius ist, wenn ich denselben mit 20 Radius machen möchte, kann ich es wie eine Animation von einem schrumpfen sehen lassen? – Nicholas714

+0

Sie könnten verschiedene Pfade erstellen (wie einen Zyklus), bis Sie Ihren Radius (Zwischenpfad) durch FadeIn und FadeOut (und entfernen) die ältesten erreichen, aber ich weiß nicht, wie das Endergebnis sein könnte, aber Sie könnten diesen Weg versuchen . –

0

I würde empfehlen, einen SKSpriteNode aus deinem SKShapeNode zu machen, da SKShapeNode fehlerhaft ist.

Optional, ich würde nach Möglichkeiten suchen, diese Textur auf der Festplatte zu speichern, so dass Sie die Form nicht jedes Mal rendern müssen.