2009-08-01 12 views
3

Comment puis-je utiliser les deux dans le même UIView correctement?CALayer drawInContext vs addSublayer

Je une sous-classé personnalisé CALayer dans lequel je dessine un motif à l'intérieur drawInContext

j'ai une autre où je configurer une superposition image PNG en tant que contenu.

J'ai un troisième qui est juste un arrière-plan.

Comment superposer ces trois éléments?

[self.layer addSublayer:bottomLayer]; // this line is the problem 

[squaresLayer drawInContext:viewContext]; 
[self.layer addSublayer:imgLayer]; 

Les 2 autres tirent correctement si je les fais dans cet ordre. Peu importe où j'essaie de mettre bottomLayer, ça empêche toujours dessineLayer de dessiner. La raison pour laquelle j'ai besoin de 3 couches est que j'ai l'intention d'animer les couleurs dans l'arrière-plan et les couches personnalisées. La couche supérieure est juste une superposition graphique.

+0

Plusieurs questions: Êtes-vous sûr que le calque n'est pas dessiné? Ou est-ce être dessiné mais ne vous donne pas les résultats que vous recherchez? Comment les couches se chevauchent-elles? Est-il nécessaire que ces couches soient toutes dans la même vue, ou pourriez-vous en diviser une en une vue différente? – Amagrammer

+0

Salut, eh bien, ils devraient être en mesure d'être dans le même UIView, je suppose que je pourrais utiliser des sous-vues, semble un peu beaucoup à utiliser des vues séparées seulement pour les couches composites. Cependant, j'ai trouvé une solution en faisant 2 couches personnalisées. Tout ce qui est ajouté à self.layer via "addSublayer" semble s'appuyer sur tout ce qui est dessiné via "drawInContext" qui est directement lié au contexte de la couche .layer de la vue. Ok donc, en calculant cela, je viens de rendre 2 couches dans ce contexte et j'ai ajouté l'imgLayer en haut. Fonctionne bien, comme pour l'animation enroulé en utilisant un NSTimer rafraîchissant la vue, qui exécute drawInContext. – Michael

Répondre

1

Aussi bien coller le code dans au cas où quelqu'un tente d'animer CALayers empilés qui ont leur propre tirage interne routines

- (void)drawRect:(CGRect)rect { 

    [imgLayer removeFromSuperlayer]; 

    CGFloat w = [self.blockViewDelegate w]; 
    CGFloat h = [self.blockViewDelegate h]; 

    CGFloat wb = w/4; 
    CGFloat hb = h/4; 

    CGContextRef viewContext = UIGraphicsGetCurrentContext(); 

    // Layers 

    [bottomLayer sizes:wb :hb :1]; 
    bottomLayer.frame = CGRectMake(0, 0, w, h); 
    bottomLayer.opaque = NO; 

    [topLayer sizes:wb :hb :0]; 
    topLayer.frame = CGRectMake(0, 0, w, h); 
    topLayer.opaque = NO; 

    // Overlay 

    imgLayer.frame = CGRectMake(0, 0, w, h); 
    imgLayer.opaque = NO; 
    imgLayer.opacity = 1.0f; 

    UIImage *overlay = [self.blockViewDelegate image]; 
    CGImageRef img = overlay.CGImage; 
    imgLayer.contents = (id)img; 

    // Add layers 

    [bottomLayer drawInContext:viewContext]; 
    [topLayer drawInContext:viewContext]; 
    [self.layer addSublayer:imgLayer]; 

} 

blockViewDelegate est l'endroit où je stocke la largeur, la hauteur et l'information d'image, il est le contrôleur pour cette UIView. TopLayer et bottomLayer sont d'une sous-classe UIView personnalisée qui dessine certaines formes dans la vue avec des informations de couleur variables. Plus tard dans mon animation, je lance simplement "setNeedsDisplay" plusieurs fois avec une minuterie et cette routine se répète, les couches redessinent en utilisant les paramètres mis à jour.