2010-09-19 16 views
4

Depuis l'affichage de la rétine, ce morceau de code de dessin semble soudainement ne plus fonctionner. L'image dessinée est légèrement décalée par rapport à la précédente et semble un peu étirée.Dois-je multiplier l'échelle avec les valeurs de points pour l'affichage de la rétine, dans ce cas?

Je dessine quelque chose dans la méthode -drawRect: d'une sous-classe UIControl. J'ai compris que l'échelle actuelle à l'intérieur de ce UIControl est en effet 2.0. Ce code obtient une CGImage d'un UIImage, qui ne connaîtra probablement rien de l'échelle. Il est alimenté en tant que paramètre d'une méthode qui prend également des valeurs de points en ce moment.

CGContextDrawImage(context, CGRectMake(drawingRect.origin.x, drawingRect.origin.y, img.size.width, img.size.height), [img CGImage]); 

Remarque: drawingRect est en points. img.size.width à l'intérieur d'un NSLog génère la valeur correcte en points, tandis que [img CGImage] génère l'image @ 2x pour l'affichage Retina. Je l'ai fait un chèque pour vérifier:

NSLog(@"image height = %f (CGImage = %d)", img.size.height, CGImageGetHeight([img CGImage])); 

sortie dans la console: image height = 31.000000 (CGImage = 62)

Comment puis-je faire face à l'image @ 2x ici? Dois-je multiplier chaque valeur avec l'échelle, manuellement? Mais ce serait aussi bousiller le rectangle visible sur l'écran, ou non?

+0

Pour ne pas minimiser votre question, mais en cas de doute, je le lance dans le simulateur comme "iPhone/iPad (Retina)", puis de nouveau comme "iPhone/iPad". Parfois, je capture chacun d'eux à des fins de comparaison. –

Répondre

3

Oui.

CGImageGetWidth([image CGImage]) == image.size.width * image.scale 
CGImageGetHeight([image CGImage]) == image.size.height * image.scale 

Vous pouvez également utiliser les -[UIImage drawAtPoint:], -[UIImage drawInRect:] et d'autres méthodes similaires qui traitent de l'échelle automatiquement. Si vous descendez à CGImage, vous devez gérer l'échelle vous-même.

+0

La raison en est que la largeur et la hauteur d'un CGImage sont en pixels, alors que la taille d'un UIImage (ou NSImage) est en points. Le facteur d'échelle est la différence entre les points et les pixels: pixels = points * échelle. –

+0

Vouliez-vous dire "traiter automatiquement la balance" plutôt que de "traiter manuellement la balance"? –

+0

Oui, je l'ai fait. Merci d'avoir attrapé ça. – rpetrich