comment avez-vous copier un CALayer?
Comment vous faire un NSArray complète de plusieurs instances d'un CALayer (tous avec la même image, le contenu, etc)?
De fond: CALayer prend un peu de surcharge pour créer, donc je voudrais créer un certain nombre de CALayers (partageant tous les mêmes propriétés) dans la méthode init de la classe (pour être utilisée plus tard dans la classe.)
- Pourquoi avez-vous besoin de les copier? Pourquoi ne pas toutes les créer à partir de zéro ou, de réduire le nombre de couches de votre application a besoin?
- oui, c'est une option (de la création à partir de zéro), mais ce n'est pas terriblement élégant
Vous devez vous connecter pour publier un commentaire.
CALayer n'a pas construit dans le
-(id)copy
méthode. Je ne sais pas pourquoi. Il n'est pas difficile de réunir votre propre cependant. Créer un CALayer catégorie et écrire votre propre copie de la méthode. Tout ce que vous avez à faire est de les instancier et récupérer manuellement le public ivars/propriétés de l'original et de la nouvelle copie. N'oubliez pas d'appeler[super copy]
BTW, CALayer est un objet. Vous pouvez l'ajouter à un NSArray.
Je n'ai pas essayé cela avec
CALayer
précisément, mais je sais que vous pouvez effectuer une copie en profondeur en prenant avantage deNSCoding
:CALayer *layer = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:layer]];
Je ne suis pas sûr de la façon de les copier aiderait vraiment avec la performance, cependant.
Je fais exactement la même chose dans mon programme.
Dans l'init:
spawnTurret:
Fond, juste je viens à plusieurs reprises de créer CALayer objets. Ça va être plus rapide que la copie, comme cette méthode nécessite seulement 1 CALayer appel par propriété, par opposition à copier ce qui vous oblige à lire la propriété puis en plus le définir. Je spawn à environ 500 objets à l'aide de cette méthode dans environ 0,02 secondes, donc c'est vraiment très rapide. Si vous avez vraiment besoin de plus de vitesse, vous pourriez même mettre en cache le fichier image.
Essayez d'utiliser CAReplicatorLayer il peut dupliquer les calques.
référence: https://developer.apple.com/documentation/quartzcore/careplicatorlayer
exemple de code: http://www.knowstack.com/swift-careplicatorlayer-sample-code/
https://developer.apple.com/documentation/quartzcore/careplicatorlayer/1522391-instancedelay
NSProxy est utilisé pour cette raison. Ce que vous décrivez est un scénario commun, et celle à partir de laquelle n'importe quel nombre de modèles de conception sont dérivés.
Pro Objective-C Modèles de Conception pour iOS offre une solution pour le problème que vous décrivez; lire le Chapitre 3: Le Protoype Modèle. Voici un résumé de la définition:
Le Prototype de modèle spécifie le type d'objets à créer à l'aide d'un prototype de l'instance, en vertu de laquelle un nouvel objet est créé par la copie de ce instan
C'est possible avec CALayerReplicator, je donne un peu plus de détails en réponse à cette autre question similaire