我正在使用带有路径的CashApelayer。现在,我希望它以大约10个厚度的光滑阴影抛出光滑的阴影。

首先:是的,我只能创建11个CashApelayer对象,每次将路径的轮廓增加1个单元的轮廓,每次迭代中都有不同的颜色和更多的alpha。但是,这样我就会炸毁内存足迹,因为这是一半的屏幕尺寸,这意味着在内存中有11倍的屏幕大小的位图。

因此,由于iPhone OS 3.2,我可能可以在Calayer上使用那些漂亮的影子属性。但是我想坚持OS 3.0。那么,除了上面令人讨厌的选择之外,我还有什么选择?

有帮助吗?

解决方案

您可以使用核心图形创建阴影。您需要的构建块在 Quartzdemo 样本。特别是看看 class QuartzMaskingViewQuartzCligping.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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top