8 votes

dessiner un CALayer dans un CGContext

J'ai le code suivant :

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSaveGState(context);

CALayer *sublayer = [CALayer layer];
sublayer.backgroundColor = [UIColor orangeColor].CGColor;
sublayer.cornerRadius = 20.0;
sublayer.frame = CGRectMake(20, 0, 300, 20);

[sublayer setNeedsDisplay];
[sublayer drawInContext:context];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return newImage;

Mais lorsque j'affiche le retour newImage, il n'y a qu'une image vide. Lorsque je remplace drawInContext par renderInContext, j'obtiens la sous-couche ci-dessus, mais il semble que le système de coordonnées soit erroné.

Une idée de la raison pour laquelle drawInContext n'a pas fonctionné ?

11voto

Luke Rogers Points 445

Essayez d'utiliser renderInContext à la place de drawInContext .

Je crois comprendre que drawInContext est là pour être remplacée, alors que renderInContext est utilisé pour rendre le contenu d'un calque dans le contexte.

En la documentation :

- drawInContext:

L'implémentation par défaut de cette méthode n'effectue aucun dessin. Si le délégué du calque implémente la méthode drawLayer:inContext: cette méthode est appelée pour réaliser le dessin proprement dit.

Les sous-classes peuvent surcharger cette méthode et l'utiliser pour dessiner le contenu du calque. Lors du dessin, toutes les coordonnées doivent être spécifiées en points dans l'espace logique des coordonnées.

- renderInContext:

Cette méthode effectue le rendu directement à partir de l'arbre des calques, en ignorant les animations ajoutées à l'arbre de rendu. Le rendu s'effectue dans l'espace de coordonnées du calque.

3voto

Jacob Points 442

Le système de coordonnées n'est pas perturbé en soi. Quartz utilise un système de coordonnées différent de celui d'UIKit. Dans Quartz, l'axe Y prend naissance en bas à gauche du rectangle d'encadrement. Les valeurs deviennent plus grandes au fur et à mesure que l'on s'éloigne vers le haut du rectangle. Pour une représentation visuelle, voir la documentation à l'adresse

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/drawingwithquartz2d/dq_overview/dq_overview.html

La différence avec UIKit réside dans le fait que l'origine du système de coordonnées d'UIKit est en haut à gauche et que les valeurs de l'axe des y deviennent plus positives au fur et à mesure que l'on se déplace vers le bas.

Quant à savoir pourquoi drawInContext : ne fonctionne pas, vous devriez également vous référer à la documentation de la classe CALayer où il est dit que "l'implémentation par défaut ne fait rien".

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CALayer_class/Introduction/Introduction.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X