2010-02-15 17 views
10

Sto creando un interruttore di attivazione/disattivazione personalizzato per iPhone (simile all'interruttore standard) e sono nel punto in cui sto impostando la maschera del dispositivo di scorrimento, ma chiamando [[myView layer] setMask:maskLayer] imposta la posizione del livello maschera rispetto al livello mascherato, non relativo al livello contenitore del livello maschera. Per questo particolare scenario, la posizione del livello maschera deve essere impostata rispetto al suo livello di contenimento poiché il cursore di attivazione si sposterà al di sotto della maschera e la maschera dovrebbe rimanere ferma.Masking a CALayer - iPhone

Senza dover animare la maschera E il componente di attivazione/disattivazione del cursore per ottenere l'effetto desiderato, qualcuno sa come farlo funzionare? Ecco quello che ho finora:

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 
CGMutablePathRef path = CGPathCreateMutable(); 

CGPathAddEllipseInRect(path, nil, CGRectMake(0, 0, 13, 13)); 
CGPathAddEllipseInRect(path, nil, CGRectMake(30, 0, 13, 13)); 
CGPathAddRect(path, nil, CGRectMake(6, 0, 32, 13)); 

[maskLayer setPath:path]; 
[maskLayer setFillColor:[[UIColor greenColor] CGColor]]; 

[[self layer] addSublayer:maskLayer]; 

[maskLayer setPosition:CGPointMake(2, 2)]; 

[self addSubview:toggleView]; 

[[toggleView layer] setMask:maskLayer]; 
+0

Se questo codice non utilizza ARC, 'path' perde. – titaniumdecoy

risposta

14

Una maschera è solo un particolare tipo di substrato, in modo che il superlayer della maschera sarà sempre lo strato è di mascheramento. Non c'è modo di aggirarlo. Inoltre, stai violando questo avviso nella documentazione:

Quando si imposta la maschera su un nuovo livello, il super strato del nuovo livello deve prima essere impostato su zero, altrimenti il ​​comportamento non è definito.

È necessario rimuovere la riga [[self layer] addSublayer:maskLayer];.

Per risolvere il problema, vorrei creare un altro livello o vista che contenga tutto ciò che è ora sul tuo toggleView e quindi aggiungere quel livello al tuo toggleLayer come sottolivello. In questo modo, puoi posizionare il nuovo sottolivello indipendentemente dalla maschera e se sposti il ​​livello genitore, sia la maschera che il sottolivello si muoveranno insieme (che è quello che dovrebbero fare se ti capisco correttamente).

+0

Fantastico, penso di vedere quello che dici, e ha più senso farlo in quel modo. Grazie! – jtrim

+4

Ho appena implementato questa soluzione e funziona benissimo! :: http://gist.github.com/306792 – jtrim