2011-11-01 4 views
13

Ho un CAGradientLayer che uso come un'ombra. Sbiadisce dal 60% di opacità per cancellare, da sinistra a destra. Sul bordo del gradiente, sembra essere la miscelazione con lo strato sottostante ed alleggerimento che strato:Miscelazione del CAGradientLayer utilizzato come ombra

Notice the ~1 pixel wide lightened effect on the photo beneath the shadow

C'è un pixel "glow" alla fine dell'ombra, dove è sbiadito per cancellare. Sembra rendere la foto dietro l'ombra più leggera alla coda dell'ombra. Ecco un primo piano:

enter image description here

Questo è il codice che produce quell'ombra:

CAGradientLayer *layer = [CAGradientLayer layer]; 
layer.frame = CGRectMake(sideBar.frame.size.width, 0, 7, sideBar.frame.size.height); 
layer.colors = [NSArray arrayWithObjects: 
       (id)[[[UIColor blackColor] colorWithAlphaComponent:0.6f] CGColor], 
       (id)[[UIColor clearColor] CGColor], 
       nil]; 
[layer setStartPoint:CGPointMake(0, 0.5)]; 
[layer setEndPoint:CGPointMake(1, 0.5)]; 
[sideBar.layer insertSublayer:layer atIndex:0]; 
sideBar.layer.masksToBounds = NO; 

Tutte le idee su come sbarazzarsi di questo?

risposta

22

I tuoi occhi ti stanno ingannando. Non c'è aumento di intensità sul bordo del gradiente. Puoi controllare- Ho ridotto l'immagine ad un'altezza di 1px nella regione del cloud e ho esaminato i valori dei colori. image shrunk to 1px height

Tuttavia, il motivo per cui si vede una linea luminosa è che le ombre non sembrano così. Il profilo di trasparenza che ti aspetteresti di vedere sarebbe più vicino a un gaussiano che a una linea retta (che è ciò che fa il gradiente lineare).

Suggerirei di aggiungere alcuni punti extra per facilitare il gradiente nella regione trasparente. Forse qualcosa di simile

layer.colors = [NSArray arrayWithObjects: 
       (id)[[[UIColor blackColor] colorWithAlphaComponent:0.6f] CGColor], 
       (id)[[[UIColor blackColor] colorWithAlphaComponent:0.3f] CGColor], 
       (id)[[[UIColor blackColor] colorWithAlphaComponent:0.1f] CGColor], 
       (id)[[UIColor clearColor] CGColor], 
       nil]; 

Potrebbe essere necessario aumentare la dimensione del gradiente per contenere questa miscelazione aggiuntiva.