2010-04-19 8 views
0

Je tente de produire une zone de découpage dans un UIView générée à partir d'objets path dans ses sous-vues. Par exemple, je pourrais avoir une sous-vue contenant un carré et une autre contenant un cercle. Je veux être en mesure de produire un clip dans la superview parent qui est l'union de ces deux formes. Quelqu'un peut-il expliquer comment faire cela? A propos de tout ce que je suis en mesure de comprendre à ce jour est que:Création d'une zone de découpe dans un UIView à partir d'objets path dans ses sous-vues

1 - drawRect du superview: méthode est appelée avant les drawRects de ses sous-vues sont et
2 - la ContextRef qui est accessible dans les trois cas est la même.

À part ça, je suis perplexe. Merci,
Howard

Répondre

2

En un mot, vous devez parcourir tous les sous-vues et laissez chacun modifier le chemin de contexte actuel, puis définissez ce chemin comme le chemin de détourage. Vous pouvez demander un chemin à partir de chaque vue ou transmettre le contexte à chaque vue.

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSaveGState(context); 
CGContextBeginPath(context); 

for (view in subviews) { 
    if ([view respondsToSelector:@selector(pathTranslatedForView:)]) { 
    CGContextAddPath(context , [(MyCustomViewPath *)view pathTranslatedForView:self]); 
    } 
} 

CGContextClip(context); 
// do stuff with clipping path 
CGContextRestoreGState(context); 

Edit:

Lorsque vous appelez la sous-vue, vous pouvez ajuster le contexte de sorte que 0,0 est à l'origine de la vue appelée, pas le superview:

CGRect frame = [view frame]; 
CGContextTranslateCTM(context , -frame.origin.x , -frame.origin.y); 
CGContextAddPath(context , [(MyCustomViewPath *)view path]; 
CGContextTranslateCTM(context , frame.origin.x , frame.origin.y); 
+0

Ah, Je l'ai presque je pense. Je suppose que l'une des tâches principales de la méthode pathTranslatedForView: de chaque sous-vue est d'ajuster les coordonnées du chemin pour prendre en compte le décalage de la sous-vue par rapport à sa superview, mais quelle est la meilleure façon de le faire? Définir une transformation de traduction avant de construire le chemin? – hkatz

+0

Cela dépend principalement des particularités de votre implémentation. Conservez-vous un CGPathRef réel dans vos vues, ou l'emplacement d'un cercle et d'un carré? De nombreuses opérations CGPath acceptent une transformation, de sorte que chaque classe peut créer une transformation pour elle-même. Ou la vue d'ensemble pourrait appliquer une transformation au contexte avant d'appeler chaque sous-vue. – drawnonward