Zeichnung woes mit CALayer
Zunächst im finden der iPhone online-Dokumentation zu nicht-so-sehr gründlich, klar, wenn es um die verschiedenen Möglichkeiten, die rendering-Schicht. Ich bekommen den jist, aber ich bin nicht klar, wenn zu verwenden, die Methoden und die erfordert die Schicht Hinzugefügt werden, sobald eine sub-Schicht oder nicht.
Mein Projekt begann, ist trivial mit mir Bilder laden und einfach zeichnen Sie einen UIView über [Bild drawAtPoint:] sowie [Bild drawInRect:]. Diese funktionieren mit der aktuellen Grafik-Kontext.
Dann heute habe ich zufällig gelesen, dieses Konzept der Verwendung von Ebenen, so dass animierend meine verschiedenen Bilder (implizit) würde in der Theorie ein Kinderspiel sein!
Für das Protokoll, ich weiß, die docs sagen Unterklassen von CALayer ist nicht notwendiger, aber ich Tat genau das.
Jetzt bin ich unglaublich verwirrt über die verschiedenen Möglichkeiten, um angeblich das Rendern einer Ebene.
- drawLayer
- displayLayer
- display
- drawInContext
Nun für alle diese Methoden, ist es erforderlich, legen Sie den layer-frame-Größe?
Ist es erforderlich, fügen Sie eine Schicht auf einem view-Schicht?
Die einzige Methode, die gibt mir sichtbare Ergebnisse ist die drawinContext Methode. Aber wenn ich eine implizite animation (z.B. Bild.Opazität = 0) nichts passiert, was lässt mich glauben, meine Schicht ist nicht richtig eingestellt.
Jemand bitte bringen Sie wieder Ordnung in dieses chaos.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Core Animation macht diese Art der Sache trivial. Brad ' s Vorschlag richtig ist. Die Quintessenz ist, dass Sie brauchen nicht alle diese Methoden einfach Rendern die Ebene. Um zu bewirken, dass der layer zu Rendern, stellen Sie sicher, Sie haben Folgendes getan:
Legen Sie die Inhalt-Eigenschaft mit:
[imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];
Legen Sie die Grenzen der Ebene, auf die Größe, die Sie wollen.
[imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
Einstellen der position (x,y-Position) der layer für die Anzeige in der Ansicht. Die Standard-anchorPoint ist die Mitte der Ebene. Dieser code zentriert den layer in der Ansicht.
[imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];
Fügen Sie die Ebene in der Ansicht layer:
[[[self view] layer] addSublayer:imageLayer];
Übrigens, wenn Sie möchten, können Sie sowohl die Grenzen und die Stellung in eine Methode von calling-setFrame:. Ich lieber mit den beiden fordert mich, wie es sich anfühlt mehr lesbar für mich, aber das ist bis zu Ihrer eigenen Präferenz. , Wenn Sie nicht die Grenzen und die position oder frame der Ebene, die Ebene jedoch nicht machen.
Wenn Euch das lieber ist, können Sie verhindern, indem drawInContext durch die Schaffung zusätzlicher Ebenen, das zeichnen von Pfaden, Formen (siehe CAShaperLayer), oder zusätzliche Bilder und fügt diese als Unterschichten des Bildes Schicht oder fügen Sie Sie als Unterschichten von Ihren übergeordneten Ebene und geben Sie eine zPosition, dass Sie vor den Augen Ihrer Bildebene.
Nun, wenn Sie möchten, animieren Sie die Deckkraft, die Sie verwenden können, implizite animation durch einfaches einstellen der layer-Eigenschaft in der genauen Art und Weise, die Sie beschrieben, z.B. [imageLayer setOpacity:0.0 f]; Dies wird verblassen der Ebene und untergeordneten Ebenen über 0,25 Sekunden.
Nur einige zusätzliche Gedanken.
Beste Grüße.
Wenn Sie möchten, dass Ihre verschiedenen Schichten zu tun, ist die Anzeige ein Bild jeder, Sie sollten nicht brauchen, um eine Unterklasse sein. Sie sollte einfach in der Lage sein, ein Bild (in CGImageRef form) die
contents
Eigentum der jeweiligen Ebene. Die Schicht wird dann mit der Zeichnung des Bildes. Erhalten Sie die Core-Graphics-Bild-Darstellung eines UIImage mit seinerCGImage
nur-Lesen-Eigenschaft.Sind Sie richtig, obwohl, über
-drawInContext:
richtigen Ort, um weitere benutzerdefinierte Zeichnung code innerhalb eines CALayer Unterklasse. Ohne Unterklassen von CALayer, können Sie ein Delegierter, ändern Sie die Ebene der Zeichnung Verhalten durch den-drawLayer:inContext:
delegate-Methode.Dies ist alles im detail beschrieben in der "Die Bereitstellung Von Layer-Inhalt" Abschnitt von Apple Core Animation Programming Guide.