如何在iOS中绘制下拉阴影

don*_*ile 6 iphone

CAShapeLayer使用CGPathRef来绘制它的东西.所以我有一条星路,我想要一个半径约为15个单位的平滑投影.可能在一些新的iPhone OS版本中有一些不错的功能,但我需要自己做一个旧版本的3.0(大多数人仍然使用).

我试图做一些非常令人讨厌的事情:我创建了一个for循环并按顺序创建了15个这样的路径,逐步变换缩放它们变得更大.然后将它们分配给新创建的CAShapeLayer,并在每次迭代时稍微降低它的alpha值.不仅这个缩放在数学上是不正确的并且很糟糕(它应该相对于轮廓发生!),阴影不是圆形的并且看起来非常难看.这就是为什么柔和的阴影具有半径.

在15个单位的阴影大小之后,恒星的尖端不应该显得非常尖锐.它们应该像奶油一样柔软.但是在我丑陋的解决方案中,它们就像恒星本身一样竖琴,因为我所做的只是将恒星缩放15次并将其降低15次.丑陋.

我想知道大家伙是怎么做到的?如果你有一个任意路径,并且该路径必须抛出阴影,那么算法如何工作呢?可能必须将路径扩展30次,相对于远离填充部分的轮廓的切线逐点扩展,并且仅需0.5个单位即可进行良好的混合.

在我重新发明轮子之前,也许有人有一个方便的例子或链接?

dra*_*ard 3

阴影是模糊和偏移的对象形状的半透明灰度蒙版。

CGContextSetShadowWithColor这就是CGContextSetShadow在 iPhone 上实现的方法。您设置阴影然后绘制一些东西,并且也会应用阴影。

CAShapeLayer 没有一个简单的选项来应用阴影。在绘制形状之前,您必须创建自定义视图或图层并设置阴影。

我没有尝试过,但以下方法可能有效:

@interface ShadowShapeLayer : CAShapeLayer
@end

@implementation ShadowShapeLayer
-(void) drawInContext:(CGContextRef)context {
  CGContextSaveGState( context );
  CGContextSetShadow( context , CGSizeMake( 5 , 5 ) , 15 );
  [super drawInContext:context];
  CGContextRestoreGState( context );
}
@end
Run Code Online (Sandbox Code Playgroud)

编辑:谢谢守财奴。