2010-10-23 6 views
0

En ce qui concerne la question an eralier question, j'ai essayé de créer une classe avec une variable membre NSMuttableArray contenant CALayerRef s. Quelqu'un peut-il me guider s'il vous plaît sur la façon de le faire. Qu'est-ce que je veux faire est de créer CALayerRef ou CGLayerRef s ou quoi que ce soit, les pousser dans ma variable layers, puis, quand j'ai besoin d'eux, chercher, utiliser leur contexte et finalement dessiner/cacher/montrer/les supprimer.Création d'une structure de calque pour une application de dessin

Je me tourne vers vous, parce qu'apparemment, il y a peu ou pas d'informations sur le net pour travailler avec des calques et Quartz à un niveau avancé. Tout le monde utilise les couches immédiatement, aucune gestion nécessaire, aucune variable membre.

Merci.

Répondre

1

Voici un code de travail pour la vue personnalisée que j'ai écrit dans quelques minutes, j'espère que cela aide. Il crée 10 couches vertes et les anime chaque seconde à différents endroits.

MBLineLayerDelegate *lineLayerDelegate; 
@property (nonatomic, retain) NSMutableArray *ballLayers; 

- (void)awakeFromNib 
{ 
    self.ballLayers = [NSMutableArray array]; 
    lineLayerDelegate = [[MBLineLayerDelegate alloc] init]; 
    for (NSUInteger i = 0; i < 10; i++) { 
     CALayer *ball = [CALayer layer]; 
     CGFloat x = self.bounds.size.width * (CGFloat)random()/RAND_MAX; 
     CGFloat y = self.bounds.size.height * (CGFloat)random()/RAND_MAX; 
     ball.frame = CGRectMake(x, y, 20, 20); 
     ball.backgroundColor = [UIColor greenColor].CGColor; 
     ball.delegate = lineLayerDelegate; 
     [self.layer addSublayer:ball]; 
     [self.ballLayers addObject:ball]; 
    } 

    [self performSelector:@selector(animateBallsToRandomLocation) withObject:nil afterDelay:0]; 
} 

- (void)animateBallsToRandomLocation 
{ 
    for (CALayer *layer in self.ballLayers) { 
     CGFloat x = self.bounds.size.width * (CGFloat)random()/RAND_MAX; 
     CGFloat y = self.bounds.size.height * (CGFloat)random()/RAND_MAX; 
     layer.position = CGPointMake(x, y); 
    } 
    [self performSelector:@selector(animateBallsToRandomLocation) withObject:nil afterDelay:1]; 
} 

est ici un code pour le délégué de CALayer qui dessine une ligne:

@interface MBLineLayerDelegate : NSObject { 
} 
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx; 
@end 

@implementation MBLineLayerDelegate 

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context 
{ 
     CGRect rect = layer.bounds; 
     CGContextSaveGState(context); 

     CGContextTranslateCTM(context, 0.0, rect.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 
     CGContextSetAllowsAntialiasing(context, YES); 
     CGContextSetShouldAntialias(context, YES); 

     CGContextMoveToPoint(context, 0, 0); 
     CGContextAddLineToPoint(context, rect.size.width, rect.size.height); 

     CGContextRestoreGState(context); 
} 

@end 
+0

que je veux tracer une ligne dans l'une des couches énumérées dans - (void) animateBallsToRandomLocation. Comment ferais-je cela? Puis-je obtenir leur contexte d'origine et y puiser? – Interfector

+0

Lisez ma réponse pour une autre votre question d'aujourd'hui, là je vous ai écrit sur la façon dont cela fonctionne - soit étendre CALayer ou mettre en place un délégué. – Michal

+0

J'espérais que ça n'arriverait pas à ça :) Non, je vais avoir du mal à implémenter votre réponse. – Interfector

Questions connexes