首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》4.8 高级练习:阴影和渐变

关灯直达底部

到目前为止,还无法使用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 绘制带有渐变效果的三角形