Frage

Ich bin mit einem CAShapeLayer mit einem Pfad. Jetzt will ich es einen glatten Schatten mit etwa 10 Einheiten Dicke werfen.

Erstens: Ja, kann ich nur 11 CAShapeLayer Objekte erstellen und jedes Mal den Umriss des Wegs um 1 Einheit mit einer anderen Farbe erhöhen und etwas mehr Alpha bei jeder Iteration. Aber auf diese Weise ich meinen Speicherbedarf, da die Sache sprengen ist die halbe Bildschirmgröße und würde dies bedeuten, 11x hat eine Bitmap von einem halben Bildschirmgröße im Speicher.

So seit iPhone OS 3.2 Ich könnte wahrscheinlich jene raffinierten Schatten Eigenschaften auf CALayer verwenden. Aber ich will 3,0 bis O bleiben. So Welche Möglichkeiten habe ich, anders als die bösen über?

War es hilfreich?

Lösung

Sie können den Schatten mit Core Graphics erstellen. Die Bausteine ??müssen Sie sind in der QuartzDemo Probe. Insbesondere hat einen Blick auf class QuartzMaskingView in QuartzClipping.m .

  1. Nehmen Sie den Inhalt der Formebene in Bild
  2. Stellen Sie den Schatten nach Ihren Wünschen
  3. Begin Transparenzebene
  4. Clip zu dem Bild von Schichten Inhalt - Sie werden außerhalb davon werden Zeichnung
  5. Zeichnen Sie Ihr Bild wieder

Dies führt im Schatten außerhalb des maskierten Bereichs gemalt.

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top