Question

J'utilise un CAShapeLayer avec un chemin. Maintenant, je veux jeter une ombre lisse avec environ 10 unités d'épaisseur.

D'abord: Oui, je pourrais créer seulement 11 objets CAShapeLayer et à chaque fois augmenter le contour du chemin par 1 unité avec une couleur différente et un peu plus alpha à chaque itération. Mais cette façon je souffle mon empreinte mémoire puisque la chose est la taille de l'écran moitié et cela signifierait avoir 11x une image bitmap de la taille de l'écran moitié en mémoire.

depuis l'iPhone OS 3.2 Je pourrais probablement utiliser ces propriétés d'ombre astucieuses sur CALayer. Mais je veux rester à OS 3.0. Alors, quelles sont les options dois-je, autre que celui méchant ci-dessus?

Était-ce utile?

La solution

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

  1. Prendre le contenu de la couche de forme dans l'image
  2. Définir l'ombre à votre goût
  3. Début 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 peinte à 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top