Question

Je suis en mesure de créer une UIImage d'une couche d'animation de base en utilisant le code suivant:

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

   return image;
}

Ce code est dans ma CALayer classe dérivée. La question que je suis en cours d'exécution en est que j'ai deux CAShapeLayers qui sont des couches d'enfants de ma couche qui ne vous laissez pas rendu à l'image résultante. Si j'ajoute CALayers standards enfants qu'ils se rendaient bien. Les documents d'Apple disent:

  

rend le récepteur et ses sous-couches   dans le contexte spécifié.

Il dit aussi qu'il est disponible depuis l'iPhone OS 2.0. Vous vous demandez s'il y a quelque chose que je suis absent ou si je dois déposer un radar.

Toutes les idées ce qui pourrait garder les CAShapeLayers enfants de se laisser entraîner à l'image?

Merci.

Était-ce utile?

La solution

Les machines de CALayer appelle renderInContext pour créer sa propriété contenu pixélisée. Mais dans un CAShapeLayer, la propriété de chemin n'est pas réellement rendu à son contenu comme on le voit par cette note dans l'en-tête:

  

La forme dans son ensemble est composited   entre le contenu de la couche et son   première sous-couche.

Il va de soi que renderInContext ne rendra pas réellement le chemin CAShapeLayer sur votre contexte. Je ne l'ai pas vraiment essayé cela pour moi-même cependant.

Autres conseils

Je ne sais pas si elle pertinente pour vous, mais il y a une note dans la documentation CALayer pour renderInContext qui dit:

**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.

Quoi qu'il en soit, je suis tombé sur un problème similaire lorsque vous utilisez la fonction UIView drawRect conjointement avec le dessin dans un contexte d'image. Le UIView général qui contenait subviews ne tirerai pas ses sous-vues si j'ai appelé drawRect (ce qui est logique maintenant en fait, car il est dit dans la documentation si vous appelez drawRect vous êtes responsable de remplir toute cette zone indépendamment des implémentations super et sous-vue). Je résolu mon problème en vient d'appeler drawRect sur tous mes sous-vues, les faisant passer leurs propres images.

Je suggère donc peut-être passer loin de renderInContext et utiliser drawInContext de CALayer à la place? Vous aurez besoin de passer outre la méthode, car elle ne fait rien par défaut. Vos sous-classes auront également besoin de déplacer les contextes à leurs cadres appropriés. Aussi pour être sûr que vous pouvez vérifier qu'aucun du code que vous ajoutez affecte le rendu normal de ces couches.

Je déposé un radar à ce sujet. Je ne vois aucune raison dans la documentation qu'il ne devrait pas work.I répondra revenir ici si / quand Apple répond au radar.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top