2013-09-23 21 views
9

Ich arbeite an CAShapeLayer. Und versuchen, nichtlinearen Pfad zu zeichnen.Ich möchte Frame auf CAShapeLayer.So kann ich CGPathGetPathBoundingBox Methode verwenden, um Frame von CGPathRef zu erhalten.Rahmen und Grenzen von CAShapeLayer

Hier Code:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [[CAShapeLayer alloc]init]; 
arcLayer.path = path; 
arcLayer.frame = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = CGPathGetPathBoundingBox(path); 
[self.layer addSublayer:arcLayer]; ` 

Bitte beachten Sie meinen Code sorgfältig .Ich gleichen Rahmen und Grenzen CAShapeLayer.My Problem festgelegt haben, wenn ich nicht Grenzen Einstellung bin (gleiche wie Rahmen), dann nicht zeigen meine Inhalte oder es wird nicht zeigen, meine Inhalte in frame.Warum? Bitte helfen Sie mir.Vielen Dank.

Antwort

8

Das Folgende ist ein Zitat aus der CALayer Dokumentation:

Der Rechteckrahmen ist Position und Größe der Schicht in dem Koordinatenraum der Superlayer spezifiziert. Bei Ebenen ist das Rahmenrechteck eine berechnete Eigenschaft, die von den Werten in den Eigenschaften bounds, anchorPoint und position abgeleitet wird. Wenn Sie dieser Eigenschaft einen neuen Wert zuweisen, ändert der Layer seine Position und seine Eigenschaften so, dass sie dem von Ihnen angegebenen Rechteck entsprechen. Die Werte jeder Koordinate im Rechteck werden in Punkten gemessen.

Es sieht aus wie mit dem CAShapeLayer wenn die frame von selbst einstellen does't es die Ursprungswerte aus dem zugeordneten CGRect halten, nur die Größe. Wenn Sie bounds einstellen, wird der Ursprung beibehalten und daher am richtigen Ort angezeigt. Sie müssen auch den Positionswert auf den Mittelpunkt setzen, wo Sie möchten, Form angezeigt werden:

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100, (0), (M_PI_2), NO); 
CGPathAddArc(path, NULL, rect.size.width/2, rect.size.height/2, 100-50, (M_PI_2), (0), YES); 
CGPathCloseSubpath(path); 
CAShapeLayer* arcLayer = [CAShapeLayer layer]; 
arcLayer.path = path; 
CGRect pathRect = CGPathGetPathBoundingBox(path); 
arcLayer.bounds = pathRect; 
arcLayer.position = CGPointMake(CGRectGetMidX(pathRect), CGRectGetMidY(pathRect)); 
[self.layer addSublayer:arcLayer]; 
+0

Also, in einem Satz: Legen Sie nicht 'Frame', nur' Grenzen' und auch 'Position' fest? –

+3

Ja. Obwohl ich dachte, dass eine Frage mit 500 Punkten eine etwas ausführlichere Antwort erforderte. –

+0

Im Allgemeinen mit Ebenen denke ich, dass Sie die besten Ergebnisse erzielen, indem Sie _bounds_ + _position_ und nicht _frame_ setzen. Aber für CAShapeLayer halte ich Grenzen nicht für wichtig, es sei denn, Sie möchten dem Inhalt eine Übersetzung hinzufügen.Das erklärt jedoch nicht, warum der Pfad nicht gezeichnet wird, oder? – nielsbot

15

Wenn Sie die frame eines CALayer ändern Sie die Größe und Position im Koordinatenraum modifizieren von sein Superspieler. frame ist ein berechneter Wert, basierend auf bounds und position des Objekts. In diesem Fall verfügt die Ebene noch nicht über eine Superschicht, sodass der Koordinatenraum dimensionslos ist. Wenn Sie frame festlegen, wird die Größe an die bounds-Eigenschaft weitergegeben, aber da jeder Punkt in einem dimensionslosen Bereich Null ist, bleibt die Position gleich null, statt wie gewünscht.

Um dies zu lösen, können Sie bounds zum Festlegen der Größe des Layers und position (was eine echte nicht berechnete Eigenschaft ist) im Koordinatenraum des Superlayers festlegen, bevor Sie es als Sublayer hinzufügen.

0

Meiner Erfahrung nach ist das Setzen des position eines CAShapeLayer völlig ausreichend, damit es auftaucht, wo Sie es wollen. Die Einstellung bounds ist dafür nicht erforderlich.

Siehe den CoreAnimationText Beispielcode für die Verwendung auf diese Weise.

+1

Das hängt davon ab, was du später mit der Schicht machst. Wenn Sie versuchen, es mit leeren 'Grenzen' zu transformieren, können die Ergebnisse urkomisch sein. –

+0

Interessant. Ich habe viele Transformationen von 'CAShapeLayer' Objekten durchgeführt, die als Sublayer eines anderen' CALayers' gruppiert sind. Zum Glück hatte ich nie Probleme. Behält das im Hinterkopf, wenn Heiterkeit entstehen sollte. – JanX2

0

Sie müssen bounds einstellen, sonst verhält es sich wie anchorPoint ist auf [0, 0] festgelegt. Wer will das? : D