2009-03-29 17 views
9

¿Cómo se hace un NSArray lleno de múltiples instancias de un CALayer (todos con el mismo marco, contenido, etc.)?¿cómo se copia un CALayer?

Antecedentes: CALayer requiere un poco de sobrecarga para crear, así que me gustaría crear un número de CALayers (todos comparten las mismas propiedades) en el método init de una clase (para usar más adelante en esa clase).

+0

¿Por qué necesita para copiarlos? ¿Por qué no crearlos todos desde cero o reducir la cantidad de capas que necesita tu aplicación? –

+0

sí, esa es una opción (crearlos todos desde cero), pero no es terriblemente elegante – Reeds

Respuesta

5

CALayer no tiene un método -(id)copy incorporado. No estoy seguro por qué. Sin embargo, no es difícil hacer tu propio. Cree una categoría CALayer y escriba su propio método de copia. Todo lo que tiene que hacer es crear instancias y obtener manualmente las ivars/propiedades públicas del original y establecerlas en la nueva copia. No olvide llamar al [super copy]

BTW, CALayer es un objeto. Puedes agregarlo a un NSArray.

1

Hago exactamente lo mismo en mi programa.

En init:

self.turrets = [NSMutableArray array]; 
    for (count = 0; count < kMaxTurrets; count++) 
     [self spawnTurret]; 

spawnTurret:

evTurret* aTurret = [[[evTurret alloc] init] autorelease]; 
CGImageRef theImage = [self turretContents]; 
aTurret.contents = theImage; 
double imageHeight = CGImageGetHeight(theImage); 
double imageWidth = CGImageGetWidth(theImage); 
double turretSize = 0.06*(mapLayer.bounds.size.width + mapLayer.bounds.size.height)/2.0; 
aTurret.bounds = CGRectMake(-turretSize*0.5, turretSize*0.5, turretSize*(imageWidth/imageHeight), turretSize); 
aTurret.hidden = YES; 
[mapLayer addSublayer:aTurret]; 
[self.turrets addObject:aTurret]; 

Básicamente, justo acabo de crear objetos en varias ocasiones CALayer. Va a ser más rápido que copiarlos, ya que este método solo requiere 1 llamada CALayer por propiedad, en lugar de copiarlo, lo que requiere que lea la propiedad y luego la configure. Genero alrededor de 500 objetos usando este método en aproximadamente 0.02 segundos, así que definitivamente es rápido. Si realmente necesitara más velocidad, incluso podría almacenar en caché el archivo de imagen.

20

No he probado esto con CALayer específicamente, pero sé que se puede realizar una copia profunda mediante el aprovechamiento de NSCoding:

CALayer *layer = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:layer]];

no estoy seguro de cómo copiarlos sería de gran ayuda con rendimiento, sin embargo.

+0

una forma brillante de copiar, gracias :) – dreampowder

2

Trate de usar CAReplicatorLayer puede duplicar sus capas.

0

NSProxy se utiliza por ese motivo. Lo que está describiendo es un escenario común, y uno del cual se derivan varios patrones de diseño.

Pro Objective-C Design Patterns para iOS proporciona la solución al problema que usted describe; lea el Capítulo 3: El patrón de prototipos. He aquí una definición resumida:

patrón del prototipo especifica el tipo de objetos para crear usando una instancia prototípica, por el que un nuevo objeto se crea copiando este Instan