2009-03-29 4 views
9

Wie erstellt man ein NSArray mit mehreren Instanzen eines CALayers (alle mit demselben Frame, Inhalt usw.)?Wie kopierst du einen CALayer?

Hintergrund: CALayer benötigt etwas Overhead zum Erstellen, daher möchte ich eine Anzahl von CALayern (die alle die gleichen Eigenschaften teilen) in der init-Methode einer Klasse erstellen (später in dieser Klasse zu verwenden).

+0

Warum brauchen Sie, sie zu kopieren? Warum nicht alle von Grund auf neu erstellen oder die Anzahl der Ebenen reduzieren, die Ihre App benötigt? –

+0

ja, das ist eine Option (sie alle von Grund auf neu zu erstellen), aber es ist nicht schrecklich elegant – Reeds

Antwort

5

CALayer hat keine eingebaute -(id)copy Methode. Ich bin mir nicht sicher warum. Es ist jedoch nicht schwer, eigene Ideen zu entwickeln. Erstellen Sie eine CALayer-Kategorie und schreiben Sie Ihre eigene Kopiermethode. Alles, was Sie tun müssen, ist instanziieren und manuell die öffentlichen Ivars/Eigenschaften aus dem Original zu holen und auf die neue Kopie einzustellen. Vergessen Sie nicht, anzurufen [super copy]

BTW, CALayer ist ein Objekt. Sie können es einem NSArray hinzufügen.

1

Ich mache genau das gleiche in meinem Programm.

In 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]; 

Im Grunde habe ich nur CALayer Objekte nur wiederholt erstellen. Es wird schneller als das Kopieren sein, da diese Methode nur 1 CALayer-Aufruf pro Eigenschaft erfordert, im Gegensatz zu dem Kopieren, das erfordert, dass Sie die Eigenschaft lesen und dann zusätzlich festlegen. Ich spawne ungefähr 500 Objekte mit dieser Methode in etwa 0,02 Sekunden, also ist es definitiv schnell. Wenn Sie wirklich mehr Geschwindigkeit benötigen, können Sie sogar die Bilddatei zwischenspeichern.

20

Ich habe dies speziell mit CALayer nicht versucht, aber ich weiß, Sie Vorteil von NSCoding, indem sie eine tief Kopie durchführen kann:

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

Ich bin nicht sicher, wie das Kopieren von ihnen wirklich helfen würde, mit Leistung, obwohl.

+0

eine brillante Art zu kopieren, danke :) – dreampowder

2

Versuchen Sie, CAReplicatorLayer zu verwenden, um Ihre Layer zu duplizieren.

0

Aus diesem Grund wird NSProxy verwendet. Was Sie beschreiben, ist ein übliches Szenario, aus dem eine beliebige Anzahl von Entwurfsmustern abgeleitet wird.

Pro Objective-C Design Patterns für iOS bietet die Lösung für genau das Problem, das Sie beschreiben; lies Kapitel 3: Das Muster der Protoypen. Hier ist eine Zusammenfassung Definition:

Das Prototypmuster der Art von Objekten spezifiziert unter Verwendung einer prototypischen Instanz zu erstellen, wodurch ein neues Objekt durch Kopieren dieses Instan erstellt