2010-05-23 45 views
2

我正在使用带有路径的CAShapeLayer。现在我希望它能够投射出约10个单位厚度的光滑阴影。如何使CAShapeLayer在iPhone OS 3.0中投影?

第一:是的,我可以创建11个CAShapeLayer对象,并且每次在每次迭代中增加1个单元的路径轮廓,使用不同的颜色和更多的alpha。但是这样我就会炸掉我的内存空间,因为这个东西只有一半的屏幕大小,这意味着11x的内存中有一半的屏幕大小的位图。

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

+0

我不知道有什么好处呢的CAShapeLayer为您提供在这种情况下,也许你会得到更好的绘图使用核芯显卡与阴影设置为你喜欢的路径自己。 – Palimondo 2011-05-19 00:07:26

回答

0

您可以使用Core Graphics创建阴影。您需要的构建块在QuartzDemo示例中进行了说明。特别看看class QuartzMaskingViewQuartzClipping.m

  1. 捕捉形状图层的内容转换成图像
  2. 设置阴影根据自己的喜好
  3. 开始透明层
  4. 夹到的图层内容的图像 - 你会被绘制的它
  5. 画出你的形象再次

这导致阴影正在绘制你的隐藏区域之外。

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