2009-08-15 12 views
3

Je suis en mesure de créer un UIImage d'une couche d'animation de base en utilisant le code suivant:CAShaperLayer -renderInContext ne fonctionne pas?

- (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. Le problème que je rencontre est que j'ai deux CAShapeLayers qui sont des couches enfant de ma couche qui ne sont pas rendues à l'image résultante. Si j'ajoute des CALayers standard en tant qu'enfants, ils sont bien rendus. Les docs Apple disent:

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

Il dit aussi qu'il est disponible depuis iPhone OS 2.0. Vous vous demandez s'il y a quelque chose qui me manque ou si je devrais déposer un radar.

Des idées sur ce qui pourrait empêcher l'enfant CAShapeLayers d'attirer l'attention sur l'image?

Merci.

Répondre

4

La machine CALayer appelle renderInContext pour créer sa propriété de contenu bitmap. 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 et sa première sous-couche de la couche.

Il va de soi que renderInContext ne rendra pas réellement le chemin CAShapeLayer sur votre contexte. Cependant, je n'ai pas essayé cela pour moi-même.

+0

Intéressant. Je me demande ce que Apple va revenir sur le radar que j'ai déposé - si c'est un comportement prévu. Je ne suis pas sûr de ce que cela signifie même que c'est composé entre le contenu et le premier sous-calque. Comment? Je suppose que cela l'expliquerait bien. Il ne semble pas que cela fasse partie du contenu si je lis bien. –

+0

Une mise à jour à ce sujet? – gwdp

0

Je ne sais pas si son pertinent 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 dessin dans un contexte d'image. L'UIView global qui contenait des sous-vues ne dessinerait pas ses sous-vues si j'appelais drawRect (ce qui est logique maintenant puisqu'il dit dans la documentation si vous appelez drawRect vous êtes responsable de remplir toute la zone sans tenir compte des implémentations super et subview). J'ai résolu mon problème en appelant simplement drawRect sur toutes mes sous-vues, en leur passant leurs propres images.

Donc, je suggère peut-être de quitter renderInContext et d'utiliser drawInContext de CALayer à la place? Vous devrez remplacer la méthode car elle ne fait rien par défaut. Vos sous-classes devront également déplacer les contextes dans leurs cadres appropriés. Aussi, pour être sûr, vous pouvez vouloir vérifier qu'aucun des codes que vous ajoutez n'affecte le rendu normal de ces couches.

+0

C'est étrange parce que je n'utilise aucun des champs spécifiés dans cet avis. Le problème est que je souhaite restituer les calques en tant qu'image, puis réutiliser l'image en ajoutant simplement la couche à l'arborescence des calques, ce qui entraîne une dégradation notable des performances par rapport à l'utilisation d'une image. Je l'utilise dans une cellule de tableau, donc je dois la rendre plus efficace, mais je veux dessiner l'image à la volée comme avoir un artiste graphique créer une nouvelle image chaque fois que nous avons besoin d'une nouvelle peau n'est pas souhaitable. Je suppose qu'il y a d'autres façons de le faire. Merci pour les commentaires. –

0

J'ai déposé un radar à ce sujet. Je ne vois aucune raison dans les documents que cela ne devrait pas fonctionner. Je vais répondre ici si/quand Apple répond au radar.

+0

J'ai trouvé que rien ne rend réellement en dehors de la forme elle-même. Je pense que c'est la façon dont c'est conçu, mais la documentation est juste faible. Sur une note de côté, vous pourriez trouver cela intéressant: http://tumbljack.com/post/179975074/complex-interpolation-with-cashapelayer-free –

+0

Avez-vous déjà reçu une réponse d'Apple? – haroldcampbell