2010-05-23 5 views
2

J'utilise un CAShapeLayer avec un chemin. Maintenant, je veux qu'il projette une ombre lisse avec environ 10 unités d'épaisseur. Premièrement: Oui, je peux créer seulement 11 objets CAShapeLayer et chaque fois augmenter le contour du chemin d'une unité avec une couleur différente et un peu plus d'alpha à chaque itération. Mais de cette façon, je gonfle mon empreinte mémoire puisque la taille de l'écran est de moitié, ce qui veut dire que j'ai 11 fois un bitmap de la moitié de la taille de l'écran en mémoire.Comment faire un CAShapeLayer jeter une ombre dans iPhone OS 3.0?

Donc, depuis iPhone OS 3.2, je pourrais probablement utiliser ces propriétés d'ombre astucieux sur CALayer. Mais je veux m'en tenir à OS 3.0. Alors, quelles options ai-je, autre que la méchante ci-dessus?

+0

Je ne sais pas quel avantage ne le CAShapeLayer vous fournir dans ce cas, vous seriez peut-être mieux dessiner le chemin même en utilisant Core Graphics avec l'ombre mis à votre goût. – Palimondo

Répondre

0

Vous pouvez créer l'ombre à l'aide de Core Graphics. Les blocs de construction dont vous aurez besoin sont décrits dans l'échantillon QuartzDemo. En particulier jeter un oeil à class QuartzMaskingView en QuartzClipping.m.

  1. capture le contenu de la couche de forme en images
  2. Réglez l'ombre à votre goût
  3. Begin couche de transparence
  4. clip à l'image du contenu des couches - vous dessinerez en dehors de celui-ci
  5. Dessinez votre image à nouveau

Il en résulte dans l'ombre à peindre l'extérieur de votre zone masquée.

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);