Comment créer un CGBitmapContext qui fonctionne pour l'affichage Retina et ne gaspille pas d'espace pour un affichage régulier?

Est-il vrai que si c'est dans UIKit, y compris drawRectle format HD de l'écran Retina est géré automatiquement? Donc, est-ce à dire dans drawRectl'actuel contexte graphique pour une résolution de 1024 x 768 vue est en fait un 2048 x 1536 pixels du Bitmap contexte?

(Mise à jour: si je créer une image en utilisant le contexte actuel dans drawRect et imprimer sa taille:

CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef image = CGBitmapContextCreateImage(context);
NSLog(@"width of context %i", (int) CGImageGetWidth(image));
NSLog(@"height of context %i", (int) CGImageGetHeight(image));

puis sur le nouvel iPad, avec la barre d'état désactivé, 2048 et 1536 est imprimé, et l'iPad 2 va montrer 1024 et 768)

Nous en fait profiter du luxe de 1 point = 4 pixels géré automatiquement pour nous.

Cependant, si nous utilisons CGBitmapContextCreatepuis ceux qui vont vraiment être pixels, pas de points? (au moins, si nous fournir une mémoire tampon de données pour l'image, la taille de la mémoire tampon (nombre d'octets) n'est évidemment pas pour une résolution plus élevée, mais pour une résolution standard, et même si nous passons NULL comme le tampon, de sorte que CGBitmapContextCreate gère la mémoire tampon pour nous, la taille est probablement le même que si l'on fait passer dans une mémoire tampon de données, et il est juste de résolution standard, pas de la Rétine résolution).

On peut toujours créer de 2048 x 1536 pour l'iPad 1 et l'iPad 2 et le Nouvel iPad, mais il perdra la mémoire et le processeur et le GPU de la puissance, comme il est seulement nécessaire pour le Nouvel iPad.

Donc faire, nous devons utiliser un if () { } else { } pour créer un bitmap contexte et comment pouvons-nous réellement faire? Et tout notre code CGContextMoveToPoint doit être ajusté pour l'écran Retina de l'utilisation x * 2 et y * 2 vs non-écran retina de simplement en utilisant x, y ainsi? Qui peut être assez ennuyeux pour le code. (ou peut-être qu'on peut définir une variable locale scaleFactor et mis à [[UIScreen mainScreen] scale] de sorte qu'il est de 1 pour une résolution standard et de 2, si elle est de la rétine, de sorte que notre x et y sera toujours x * scaleFactory * scaleFactor au lieu de simplement x et y lorsque l'on tire à l'aide de CGContextMoveToPointetc.)

Il semble que UIGraphicsBeginImageContextWithOptions pouvez en créer un de la Rétine automatiquement si l'échelle de 0.0 est passé, mais je ne pense pas qu'il peut être utilisé si j'ai besoin de créer le contexte et le garder (et à l'aide de ivar ou la propriété de UIViewController pour le tenir). Si je n'ai pas le libérer à l'aide de UIGraphicsEndImageContextalors il reste dans le contexte graphique de la pile, donc il semble que je dois utiliser CGBitmapContextCreate à la place. (ou avons-nous simplement de la laisser rester au bas de la pile et ne pas s'inquiéter à ce sujet?)

source d'informationauteur