如何使CashApelayer在iPhone OS 3.0中抛出阴影?
-
04-10-2019 - |
题
我正在使用带有路径的CashApelayer。现在,我希望它以大约10个厚度的光滑阴影抛出光滑的阴影。
首先:是的,我只能创建11个CashApelayer对象,每次将路径的轮廓增加1个单元的轮廓,每次迭代中都有不同的颜色和更多的alpha。但是,这样我就会炸毁内存足迹,因为这是一半的屏幕尺寸,这意味着在内存中有11倍的屏幕大小的位图。
因此,由于iPhone OS 3.2,我可能可以在Calayer上使用那些漂亮的影子属性。但是我想坚持OS 3.0。那么,除了上面令人讨厌的选择之外,我还有什么选择?
解决方案
您可以使用核心图形创建阴影。您需要的构建块在 Quartzdemo 样本。特别是看看 class QuartzMaskingView
在 QuartzCligping.m.
- 将形状层的内容捕获到图像中
- 将阴影设置为您的喜好
- 开始透明度层
- 剪辑到层内容的图像 - 您将在其外部绘制
- 再次绘制图像
这导致阴影被涂在蒙面区域外。
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);
不隶属于 StackOverflow