Domanda

sto usando un CAShapeLayer con un percorso. Ora voglio gettare un'ombra liscio con circa 10 unità di spessore.

Prima: Si, ho potuto creare oggetti appena 11 CAShapeLayer e ogni volta aumentare il contorno del percorso di 1 unità con un colore diverso ed alcuni più alfa su ogni iterazione. Ma in questo modo ho colpo la mia occupazione di memoria dal momento che la cosa è la dimensione dello schermo e la metà questo significherebbe avere 11x una bitmap di dimensioni metà dello schermo in memoria.

Quindi, dal momento iPhone OS 3.2 che probabilmente potrebbe usare tali proprietà ombra nifty su CALayer. Ma voglio attenersi a OS 3.0. Così quali opzioni devo, diverso da quello sopra brutto?

È stato utile?

Soluzione

Si potrebbe creare l'ombra con core grafico. Gli elementi costitutivi di cui avrete bisogno sono descritte in QuartzDemo del campione . In particolare, hanno uno sguardo al class QuartzMaskingView in QuartzClipping.m .

  1. Cattura il contenuto del livello di forma in immagine
  2. Imposta l'ombra di vostro gradimento
  3. Inizia livello di trasparenza
  4. clip per l'immagine del contenuto di strati - sarete disegnando al di fuori di esso
  5. Tracciate di nuovo l'immagine

Questo si traduce in ombra dipinta al di fuori della propria area mascherata.

CGSize size = CGSizeMake(300, 100);

UIGraphicsBeginImageContextWithOptions(size,NO, 0.0);
[shapeLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGRect flippedImageRect = 
    CGRectMake(0, 0, image.size.width, -image.size.height);

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextSetShadowWithColor(ctx, CGSizeMake(4, 4), 2, 
    [[UIColor colorWithWhite:0 alpha:0.4] CGColor]);
CGContextBeginTransparencyLayer(ctx, NULL);
CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextClipToMask(ctx, flippedImageRect, [image CGImage]);   
CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]); 
CGContextDrawImage(ctx, flippedImageRect, [image CGImage]);
CGContextEndTransparencyLayer(ctx);
CGContextRestoreGState(ctx);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top