CodeV

6.9-绘制3D字母

清单6-7合并了要读到的构建3D字母效果的技术,如图6-15所示。 到目前为止,在本章中,您已经阅读了关于透明度图层,渐变和路径描边的剪切。 单独来看,这些工具每个都是dry和unengaging的。 但是,结合到一起,他们就会产生在这里看到的引人注目的结果。

图6-15

图6-15使用渐变,透明度层和路径裁剪创建3D字母。

此图形由用浅到深渐变绘制的字母组成。 剪切路径,并从顶部到底部绘制渐变。 接下来,剪切到边缘的路径在每个字母周围添加反向的由暗到亮渐变的装点。 透明层确保操作在一起,两个绘制操作创建一个阴影,投射到右下角。

清单6-7还向图形添加了一个内部阴影(见第5章),在每个字母的底部为文本添加了一些额外的形状定义。 与灰色渐变轮廓相比,这会在每个字母的底部产生额外的“高度”。

清单6-7具有3D效果的文本图形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#define COMPLAIN_AND_BAIL(_COMPLAINT_, _ARG_) \
{NSLog(_COMPLAINT_, _ARG_); return;}

// Brightness scaling
UIColor *ScaleColorBrightness(
UIColor *color, CGFloat amount)
{
if (!color) return [UIColor blackColor];

CGFloat h, s, v, a;
[color getHue:&h saturation:&s brightness:&v alpha:&a];
CGFloat v1 = fmaxf(fminf(v * amount, 1), 0);
return [UIColor colorWithHue:h
saturation:s brightness:v1 alpha:a];
}

void DrawStrokedShadowedShape(UIBezierPath *path,
UIColor *baseColor, CGRect dest)
{
CGContextRef context = UIGraphicsGetCurrentContext();
if (!context)
COMPLAIN_AND_BAIL(@"No context to draw to", nil);

PushDraw(^{
CGContextSetShadow(context, CGSizeMake(4, 4), 4);

PushLayerDraw(^{
// Draw letter gradient (to half brightness)
PushDraw(^{
Gradient *innerGradient =
[Gradient gradientFrom:baseColor
to:ScaleColorBrightness(baseColor, 0.5)];
[path addClip];
[innerGradient drawTopToBottom:path.bounds];
});

// Add the inner shadow with darker color
PushDraw(^{
CGContextSetBlendMode(context, kCGBlendModeMultiply);
DrawInnerShadow(path, ScaleColorBrightness(
baseColor, 0.3), CGSizeMake(0, -2), 2);
});

// Stroke with reversed gray gradient
PushDraw(^{
[path clipToStroke:6];
[path.inverse addClip];
Gradient *grayGradient =
[Gradient gradientFrom:WHITE_LEVEL(0.0, 1)
to:WHITE_LEVEL(0.5, 1)];
[grayGradient drawTopToBottom:dest];
});
});
});
}

本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。