2016-08-03 41 views
0

Ich habe eine Unterklasse von UIView mit einer XIB Datei von UIViewController verbunden.CAShapeLayer ist nicht sichtbar

ich PocketSVG bin mit meiner SVG Datei zu CGPath so konvertieren:

override func awakeFromNib() { 
     let myPath = PocketSVG.pathFromSVGFileNamed("").takeUnretainedValue() 

     let myShapeLayer = CAShapeLayer() 
     myShapeLayer.path = myPath 

     myShapeLayer.strokeColor = UIColor.redColor().CGColor 
     myShapeLayer.lineWidth = 3 
     myShapeLayer.fillColor = UIColor.whiteColor().CGColor 

     self.layer.addSublayer(myShapeLayer) 
    } 

das Problem ist, dass, wenn ich die app betreibe ich nichts sehen kann, ist die Schicht nicht sichtbar.

Was mache ich jetzt falsch?

Vielen Dank!

+0

Wenn Sie einen Breakpoint verwenden und 'myShapeLayer' drucken, was ist sein Frame? Auf den ersten Blick scheint es so zu sein, dass Sie der Shape-Ebene keinen Rahmen gegeben haben, was bedeutet, dass der Rahmen "CGRectZero" ist und nicht auf dem Bildschirm angezeigt wird. – keithbhunter

+1

Erstens, sind Sie sicher, dass Sie eine gültige 'CGPathRef' erhalten? Ich würde 'myPath' überprüfen. Zweitens, wenn Sie 'awakeFromNib' überschreiben, möchten Sie vielleicht' super' aufrufen. – Rob

+0

@keithbhunter Ja, der Rahmen ist '0,0,0,0', um ihn in' self.view' zu ändern? –

Antwort

1

Gegeben, was Sie für CGPathGetPathBoundingBox gemeldet haben, können Sie den Pfad so transformieren, dass er in den sichtbaren Teil des Fensters fällt.

Zum Beispiel, wenn Sie das so übersetzen und skalieren sie paßt die Ansicht:

let insetRect = CGRectInset(bounds, lineWidth/2.0, lineWidth/2.0) 
let boundingRect = CGPathGetPathBoundingBox(myPath) 
let scale = min(insetRect.size.height/boundingRect.size.height, insetRect.size.width/boundingRect.size.width) 
var transform = CGAffineTransformScale(CGAffineTransformMakeTranslation(-boundingRect.origin.x * scale + insetRect.origin.x, -boundingRect.origin.y * scale + insetRect.origin.y), scale, scale) 

let transformedPath = CGPathCreateMutableCopyByTransformingPath(myPath, &transform) 

Es gibt viele Permutationen auf dieser Idee, aber hoffentlich zeigt es das Konzept.

+0

Danke! Das ist funktioniert !! aber die Größe ist kleiner als es sein sollte, ich möchte es in der Größe der Ansicht sein. Wie kann ich das machen? –

+0

Ich habe es eingerichtet, um die minimale Skalierung zu verwenden, die benötigt wird, um das Ganze in die Ansicht zu passen. Dein Pfad war furchtbar breit, aber nicht sehr groß, so dass er am oberen Rand der Ansicht zusammengekniffen erscheint. Sie können diese "Skalierung" nach Ihren Wünschen anpassen. Sie können auch die 'Transformation' anpassen (z. B. um es zu zentrieren oder was haben Sie). Oder Sie lassen den Benutzer die Skalierung mit einem Pinch-Zoom anpassen. – Rob

+0

können Sie mir bitte zeigen, wie kann ich es auf die maximale Größe der Ansicht einstellen? –