Frage

Ich kann mit dem folgenden Code eine Benutzeroberfläche aus einer Kernanimationsschicht erstellen:

- (UIImage*)contentsImage;
{
   UIGraphicsBeginImageContext([self bounds].size);
   [self renderInContext:UIGraphicsGetCurrentContext()];
   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();

   return image;
}

Dieser Code befindet sich in meiner von Calayer abgeleiteten Klasse. Das Problem, in das ich mich befinde, ist, dass ich zwei Cashapelayer habe, die Kinderschichten meiner Schicht sind, die nicht auf das resultierende Bild gerendert werden. Wenn ich Standardkala als Kinder hinzufüge, werden sie gut gerendert. Die Apple -Dokumente sagen:

Rendert den Empfänger und seine Sublayer in den angegebenen Kontext.

Es heißt auch, dass es seit dem iPhone OS 2.0 verfügbar ist. Ich frage mich, ob ich etwas fehlt oder ob ich ein Radar einreichen sollte.

Irgendwelche Ideen, was könnten die Cashapelayer des Kindes davon abhalten, sich vom Bild zu ziehen?

Vielen Dank.

War es hilfreich?

Lösung

Die Calayer -Maschinerie ruft Renderincontext auf, um seine Eigenschaft mit Bitmaped Contents zu erstellen. In einem Cashapelyer wird die Pfadeigenschaft jedoch nicht tatsächlich in den Inhalt geraten, wie in dieser Notiz im Header zu sehen ist:

Die Form als Ganzes wird zwischen dem Inhalt der Schicht und seinem ersten Unterschicht zusammengesetzt.

Es liegt auf der Hand, dass Renderincontext den Cashapelayer -Pfad nicht tatsächlich auf Ihren Kontext übertragen wird. Ich habe das aber nicht für mich selbst ausprobiert.

Andere Tipps

Ich weiß nicht, ob es für Sie relevant ist, aber es gibt eine Notiz in der Calayer -Dokumentation für Renderincontext mit der Aufschrift:

**Important**: The Mac OS X v10.5 implementation of this method does not
support the entire Core Animation composition model. QCCompositionLayer, 
CAOpenGLLayer, and QTMovieLayer layers are not rendered. Additionally,
layers that use 3D transforms are not rendered, nor are layers that specify 
backgroundFilters, filters, compositingFilter, or a mask values. 
Future versions of Mac OS X may add support for rendering these layers
and properties.

Wie auch immer, ich bin auf ein ähnliches Problem gestoßen, als ich die UIView -DrawRect -Funktion in Verbindung mit dem Zeichnen in einem Bildkontext verwendete. Die allgemeine UIView, die Unteransicht enthielt, würde seine Unteransicht nicht zeichnen, wenn ich DrawRect angerufen habe (was jetzt tatsächlich sinnvoll ist, da sie in der Dokumentation angegeben ist, wenn Sie Drawrect aufrufen, dass Sie für die Füllung dieses gesamten Bereichs unabhängig von Super- und Unteransicht -Implementierungen verantwortlich sind). Ich löste mein Problem, indem ich DrawRect auf allen meinen Unteransichten gerufen habe und ihnen ihre eigenen Frames weitergab.

Ich würde also empfehlen, mich vom Renderincontext zu wenden und stattdessen Calayers DrawinContext zu verwenden? Sie müssen die Methode überschreiben, da sie standardmäßig nichts bewirkt. Ihre Unterklassen müssen auch die Kontexte auf ihre entsprechenden Frames verschieben. Um sicher zu sein, möchten Sie möglicherweise überprüfen, ob keiner der Code, den Sie hinzufügen, das normale Rendering dieser Ebenen beeinflusst.

Ich habe ein Radar dazu eingereicht. Ich kann keinen Grund in den Dokumenten sehen, dass es nicht funktionieren sollte. Ich werde hier wieder antworten, wenn Apple auf das Radar antwortet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top