到目前为止,还无法使用Objective-C类绘制阴影和渐变,只能使用Core Graphics。
绘制阴影之前,需要将阴影效果添加到一个图形上下文中,之后在该图形上下文中绘制的所有不透明图像都会带有阴影效果。可以为阴影设置偏移量(使用CGSize表示)和模糊指数(使用CGFloat表示)。以下是为图形上下文添加阴影效果的方法声明:
voidCGContextSetShadow(
CGContextRef context,
CGSize offset,
CGFloat blur);
还有一个方法可以设置一个颜色参数,为简单起见,这里使用默认阴影颜色。
请注意没有删除阴影效果的函数。因此需要在添加阴影效果之前保存绘图状态,之后再恢复没有阴影效果的状态。类似于以下代码:
CGContextSaveGState(currentContext);
CGContextSetShadow(currentContext, CGSizeMake(4,7), 3);
// 在这里绘制的图像会带有阴影效果
CGContextRestoreGState(currentContext);
// 在这里绘制的图像没有阴影效果
练习的第一部分是为上一个练习中绘制的图像添加阴影效果,如图4-22所示。
图4-22 绘制阴影
渐变用来在图形中填充一系列平滑过渡的颜色。可以在CGGradientRef中设置需要的颜色和渐变的方式(线性渐变和径向渐变)。类似于以下代码:
CGFloat locations[2] = { 0.0, 1.0 };
CGFloat components[8] = { 1.0, 0.0, 0.0, 1.0, // 起始颜色为红色
1.0, 1.0, 0.0, 1.0 }; // 终止颜色为黄色
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB;
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace,
components,
locations,2);
CGPoint startPoint = ...;
CGPoint endPoint = ...;
CGContextDrawLinearGradient(currentContext, gradient,
startPoint, endPoint, 0);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorspace);
CGContextDrawLinearGradient函数的最后一个参数用来设置起始位置(startPoint)和终止位置(endPoint)以外的绘制区域的颜色填充方式。如果需要使用起始颜色填充起始位置之前的绘制区域,可以将最后一个参数设置为kCGGradientDraws- BeforeStartLocation。相反,如果需要使用终止颜色填充终止位置之后的绘制区域,可以设置为kCGGradientDrawsAfterEndLocation。如果渐变起止位置以外的绘制区域都需要填充,可以使用位运算符将两个选项连接起来:
CGContextDrawLinearGradient(currentContext, gradient, startPoint, endPoint,
kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
请注意,与填充颜色不同,无法使用渐变填充路径——渐变会直接填满整个图形上下文。因此,如果需要将渐变应用在指定路径范围以内,必须使用剪切路径(clipping path)裁剪图形上下文。同时,与绘制阴影时的情况类似,没有函数可以删除剪切路径,同样需要在使用剪切路径之前保存绘图状态,填充渐变之后再恢复绘图状态。
以下代码将一个UIBezierPath对象myPath设置为当前图形上下文currentContext的剪切路径:
CGContextSaveGState(currentContext);
[myPath addClip];
// 在这里为myPath填充渐变
CGContextRestoreGState(currentContext);
练习的第二部分是绘制一个带有渐变效果的三角形。起始颜色(底部)是黄色,终止颜色(顶部)是绿色,如图4-23所示。
图4-23 绘制带有渐变效果的三角形