前面已经介绍了CGContextRef为设置图形阴影提供了如下两个函数。
void CGContextSetShadow(CGContextRef context, CGSize offset, CGFloat blur):该函数设置阴影在X、Y方向上的偏移,并设置阴影的模糊程度。该函数的offset包含两个CGFloat值,第1个CGFloat值控制阴影在X方向的偏移,如果该值为正,则向右偏移,否则向左偏移;第2个CGFloat值控制阴影在Y方向的偏移,如果该值为正,则向下偏移,否则向上偏移。最后一个blur参数控制阴影的模糊程度,如果blur参数为1,表明阴影几乎不模糊,blur参数越大,阴影越模糊。
void CGContextSetShadowWithColor(CGContextRef context, CGSize offset, CGFloat blur, CGColorRef color):该函数与前一个函数的功能基本相似,只是该函数多了一个属性用于设置阴影颜色。
下面的程序示范了为所绘制的形状添加阴影。首先创建一个Single View Application,该Application包含一个应用程序委托代理类、一个视图控制器和配套的Storyboard界面设计文件。将该界面设计文件中最大的View改为使用自定义的FKShadowView类。该程序的控制器类几乎无须修改,只要重写FKShadowView的drawRect:方法,在该方法中设置阴影,并绘制带阴影的形状和文本即可。下面是FKShadowView类的实现代码。
程序清单:codes/12/12.2/ShadowTest/ShadowTest/FKShadowView.m
- @implementation FKShadowView
- - (void)drawRect:(CGRect)rect
- {
- CGContextRef ctx = UIGraphicsGetCurrentContext(); // 获取绘图的CGContextRef
- // 使用默认的阴影颜色,阴影向左上角投影,模糊度为5
- CGContextSetShadow(ctx, CGSizeMake(8, -6), 5);
- CGContextSetRGBFillColor (ctx, 1, 0, 1, 1); // 设置填充颜色
- CGContextSetRGBStrokeColor (ctx, 0, 0, 1, 1); // 设置线条颜色
- CGContextSetTextDrawingMode (ctx, kCGTextFill); // 设置使用填充模式绘制文字
- // 绘制文字
- [@"疯狂iOS讲义" drawAtPoint:CGPointMake(10 ,20)
- withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
- [UIFont fontWithName:@"Arial Rounded MT Bold" size: 45]
- , NSFontAttributeName ,
- [UIColor magentaColor] , NSForegroundColorAttributeName, nil]];
- // 设置使用描边模式绘制文字
- CGContextSetTextDrawingMode (ctx, kCGTextStroke);
- // 绘制文字
- [@"疯狂Android讲义" drawAtPoint:CGPointMake(10 ,80)
- withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:
- [UIFont fontWithName:@"Heiti SC" size: 40], NSFontAttributeName ,
- [UIColor magentaColor] , NSForegroundColorAttributeName, nil]];
- // 使用默认的阴影颜色,阴影向右下角投影,模糊度为20
- CGContextSetShadowWithColor(ctx, CGSizeMake(10, 8), 10
- , [[UIColor redColor] CGColor]);
- CGContextFillRect(ctx, CGRectMake(20 , 150 , 180 , 80));
- CGContextSetRGBStrokeColor (ctx, 1, 0, 1, 1); // 设置线条颜色
- CGContextStrokeRect(ctx, CGRectMake(30 , 260 , 180 , 80));
- }
上面程序中的第一行粗体字代码使用默认的阴影颜色,通过传入CGSizeMake(8, -6)参数控制阴影向左上角投影;第二行粗体字代码使用红色作为阴影颜色,通过传入CGSizeMake(10, 8)参数控制阴影向右下角投影。编译、运行该程序,即可看到如图12.6所示的效果。