iOS: ¿Cómo apoyo Retina Display con CGLayer?
retina-display (2)
Así es como dibujar un CGLayer correctamente para todas las resoluciones.
Al crear la capa por primera vez, debe calcular los límites correctos multiplicando las dimensiones con la escala:
int width = 25; int height = 25; float scale = [self contentScaleFactor]; CGRect bounds = CGRectMake(0, 0, width * scale, height * scale); CGLayer layer = CGLayerCreateWithContext(context, bounds.size, NULL); CGContextRef layerContext = CGLayerGetContext(layer);
A continuación, debe establecer la escala correcta para el contexto de su capa:
CGContextScaleCTM(layerContext, scale, scale);
Si el dispositivo actual tiene una pantalla de retina, todos los dibujos realizados en la capa ahora se dibujarán el doble de grande.
Cuando finalmente dibuje el contenido de su capa, asegúrese de usar CGContextDrawLayerInRect y suministre el CGRect sin escalar:
CGRect bounds = CGRectMake(0, 0, width, height); CGContextDrawLayerInRect(context, bounds, layerContext);
¡Eso es!
Estoy dibujando una gráfica en un CALayer en su método de delegado drawLayer:inContext:
Ahora quiero admitir Retina Display, ya que el gráfico se ve borroso en los últimos dispositivos.
Para las partes que dibuje directamente en el contexto gráfico que pasa el CALayer, puedo dibujar en alta resolución configurando la propiedad contentScale de CALayer de la siguiente manera.
if ([myLayer respondsToSelector:@selector(setContentsScale:)]) {
myLayer.contentsScale = [[UIScreen mainScreen] scale];
}
Pero para las partes que uso CGLayer todavía se dibujan borrosas.
¿Cómo puedo dibujar en un CGLayer en alta resolución para admitir Retina Display?
Quiero usar CGLayer para dibujar las mismas formas de gráfico del gráfico repetidamente, así como para cortar las líneas del gráfico que exceden el borde de la capa.
Obtengo CGLayer de CGLayerCreateWithContex
con el contexto de gráficos que se transfirió desde CALayer, y dibujé en su contexto usando funciones CG como CGContextFillPath
o CGContextAddLineToPoint
.
Necesito admitir tanto iOS 4.x como iOS 3.1.3, tanto Retina como la pantalla heredada.
Gracias,
Kura
Decidí no usar CGLayer y dibujar directamente en el contexto de gráficos del CALayer, y ahora está bien dibujado en alta resolución en la pantalla de retina.
Encontré la pregunta similar here y descubrí que no tiene sentido usar CGLayer en mi caso.
Utilicé CGLayer debido al programa de ejemplo de Apple "Uso de múltiples objetos CGLayer para dibujar una bandera" que se encuentra en la guía de programación de Quartz 2D. En este ejemplo, crea un CGLayer para una estrella y lo usa varias veces para dibujar 50 estrellas. Pensé que esto era por una razón de rendimiento, pero no vi ninguna diferencia de rendimiento.
Para el propósito de cortar las líneas del gráfico que exceden el borde de la capa, decidí usar varios CALayers.