如何让CAShapeLayer在iPhone OS 3.0中投下阴影?

时间:2010-05-23 19:30:17

标签: iphone cashapelayer

我正在使用带路径的CAShapeLayer。现在我希望它能够产生大约10个单位厚度的光滑阴影。

首先:是的,我只能创建11个CAShapeLayer对象,并且每次使用不同的颜色将路径的轮廓增加1个单位,并在每次迭代时增加一些alpha。但是这样我的内存占用量就会增加,因为这个东西是半屏尺寸的,这意味着在内存中有11倍的半屏尺寸位图。

因此,自iPhone OS 3.2起,我可以在CALayer上使用那些漂亮的阴影属性。但我想坚持OS 3.0。那么我有什么选择,除了上面讨厌的那个?

1 个答案:

答案 0 :(得分:0)

您可以使用Core Graphics创建阴影。 QuartzDemo示例中描述了您需要的构建块。请特别注意 QuartzClipping.m 中的class QuartzMaskingView

  1. 将形状图层的内容捕获为图像
  2. 根据您的喜好设置阴影
  3. 开始透明层
  4. 剪辑到图层内容的图像 - 您将在其外部绘图
  5. 再次绘制图像
  6. 这会导致阴影被涂在遮罩区域之外。

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