Problème d’inversion des systèmes de coordonnées entre CoreGraphics et UIKit

Afficher une image, pas de problèmes… Tracer des traits, pas de problèmes…

Faire les deux en même temps, début des soucis : l’image est inversée par rapport aux traits ! (ou l’inverse suivant le sens dans lequel on regarde…). En effet, le système de coordonnées utilisé par CoreGraphics est inversé par rapport au système de coordonnées utilisé par UIKit.

Une solution (il y en a surement d’autres !) est la suivante :

CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
CGRect imageRect = CGRectMake(0.0, 0.0, image.size.width, image.size.height);

CGLayerRef layer = CGLayerCreateWithContext(graphicsContext, image.size, nil);
CGContextRef layerContext = CGLayerGetContext(layer);
UIGraphicsPushContext(layerContext);
[image drawInRect:imageRect];
UIGraphicsPopContext();
CGContextDrawLayerInRect(graphicsContext, imageRect, layer);

// Ligne qui traverse l'écran du coin en haut à gauche jusqu'en bas à droite
CGContextSetRGBStrokeColor(graphicsContext, 1.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(graphicsContext, 4.0);
CGContextBeginPath(graphicsContext);
CGContextMoveToPoint(graphicsContext, 0.0, 0.0);
CGContextAddLineToPoint(graphicsContext, 320.0, 480.0);
CGContextStrokePath(graphicsContext);

On passe par un layer et par un context intermédiaire pour tracer notre image en utilisant simplement le drawInRect. Le PushContext et PopContext sont ici très pratiques…

  • Trackback ( 0 )
  • Commentaires ( 0 )
  1. Aucun commentaire pour l'instant

  1. Aucun trackback pour l'instant