Zeichnen mit CALayer

8

Zunächst einmal finde ich die iPhone-Online-Dokumente nicht ganz so klar, wenn es um die verschiedenen Möglichkeiten geht, eine Ebene zu rendern. Ich bekomme die jist davon, aber ich bin nicht klar, wann welche Methoden verwendet werden und welche die Schicht als Unterschicht hinzugefügt werden müssen oder nicht.

Mein Projekt begann mit dem einfachen Laden von Bildern und dem einfachen Zeichnen in eine UIView über [image drawAtPoint:] sowie [image drawInRect:]. Diese funktionieren gut mit dem aktuellen Grafikkontext.

Heute habe ich zufällig dieses Konzept der Verwendung von Layern gelesen, so dass die Animation meiner verschiedenen Bilder (implizit) theoretisch ein Kinderspiel wäre!

Für die Aufzeichnung, ich weiß, dass die Dokumente sagen, Unterklassen CALayer ist nicht notwendig, aber ich habe genau das getan. Jetzt bin ich unglaublich verwirrt über die verschiedenen Möglichkeiten, eine Ebene zu rendern.

  • drawLayer
  • displayLayer
  • Anzeige
  • drawInContext

Ist es jetzt für all diese Methoden erforderlich, die Rahmengröße der Ebene festzulegen? Ist es erforderlich, dem Layer einer Ansicht einen Layer hinzuzufügen?

Die einzige Methode, die mir sichtbare Ergebnisse liefert, ist die draininContext-Methode. Aber wenn ich eine implizite Animation anwende (z. B. image.opacity = 0) passiert nichts, was mich glauben lässt, dass meine Ebene nicht richtig eingerichtet ist.

Jemand bringt bitte die Ordnung zurück in dieses Chaos.

    
AlvinfromDiaspar 20.08.2009, 04:51
quelle

2 Antworten

18

Core Animation macht solche Dinge trivial. Brads Vorschlag ist richtig. Die Quintessenz ist, dass Sie keine dieser Methoden benötigen, um die Ebene einfach rendern zu machen. Stellen Sie Folgendes sicher, damit die Ebene gerendert wird:

  • Setzen Sie die Inhaltseigenschaft mit:

    [imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];

  • Legen Sie die Grenzen der Ebene auf die gewünschte Größe fest.

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • Legen Sie die Position (x, y-Position) der Ebene fest, die in der Ansicht angezeigt werden soll. Der Standard-Ankerpunkt ist der Mittelpunkt der Ebene. Dieser Code zentriert die Ebene in Ihrer Ansicht.

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • Fügen Sie die Ebene zur Ebene Ihrer Ansicht hinzu:

    [[[self view] layer] addSublayer:imageLayer];

Wenn Sie möchten, können Sie übrigens sowohl Grenzen als auch Position in einer Methode festlegen, indem Sie -setFrame: aufrufen. Ich bevorzuge es, die zwei Anrufe selbst zu benutzen, da es sich für mich besser lesbar anfühlt, aber das hängt von Ihrer eigenen Präferenz ab. Wenn Sie die Grenzen und die Position oder den Rahmen der Ebene nicht festlegen, wird die Ebene jedoch nicht dargestellt.

Wenn Sie möchten, können Sie vermeiden, drawInContext zu verwenden, indem Sie zusätzliche Ebenen erstellen, die Pfade, Formen (siehe CAShaperLayer) oder zusätzliche Bilder zeichnen und sie als Unterebenen Ihrer Bildebene hinzufügen oder sie als Unterebenen Ihrer übergeordneten Ebene und Give hinzufügen Sie haben eine zPosition, die bewirkt, dass sie vor Ihrer Bildebene angezeigt werden.

Wenn Sie jetzt die Deckkraft animieren möchten, können Sie implizite Animation verwenden, indem Sie einfach die Layer-Eigenschaft auf die genau beschriebene Weise festlegen, z. [imageLayer setOpacity: 0.0f]; Dadurch werden die Ebene und alle untergeordneten Ebenen innerhalb von 0,25 Sekunden ausgeblendet.

Nur ein paar zusätzliche Gedanken.

Beste Grüße.

    
Matt Long 20.08.2009, 19:35
quelle
2

Wenn Ihre verschiedenen Ebenen nur jeweils ein Bild anzeigen sollen, müssen Sie sie überhaupt nicht unterklassieren. Sie sollten nur in der Lage sein, ein Bild (in der CGImageRef-Form) auf die contents -Eigenschaft jeder Ebene zu setzen. Die Ebene wird dann mit der Zeichnung dieses Bildes umgehen. Sie können die Core Graphics-Bilddarstellung eines UIImage mithilfe der schreibgeschützten Eigenschaft CGImage abrufen.

Sie haben jedoch Recht, dass -drawInContext: der richtige Ort ist, um mehr benutzerdefinierten Zeichencode in eine CALayer-Unterklasse einzufügen. Ohne CALayer-Subklassen zu erstellen, können Sie einen Delegaten das Zeichnungsverhalten des Layers über die Methode -drawLayer:inContext: delegate ändern lassen.

Dies alles wird detailliert im "Bereitstellen von Layer-Inhalten" in Apples Core Animation Programming Guide .

    
Brad Larson 20.08.2009 12:33
quelle