本帖最后由 fantacyleo 于 2014-7-11 14:10 编辑
苹果的Mac OS和iOS有许多层次,不同层次提供了不同的框架,这些框架有的是用C写的(通常是底层),有的是用OC写的(通常是比较接近开发者的上层)。由于OC代码可以与C代码混合书写,这就可以让开发者在不同层次的框架之间自由驰骋,既充分利用上层框架的高度抽象、简便易用,在需要底层才能完成的功能时又可以无缝切换到C代码调用底层API。
今天体验了一把Core Graphics这个底层C框架。李老师的零基础视频讲Foundation框架的结构体时提到过Core Graphics:那些CG开头的结构体CGPoint、CGRect等等就来自Core Graphics。如果你只是想绘制图形,那么用OC语法调UI开头的类及其方法就可以了。但如果想加阴影效果和渐变色,就需要用到Core Graphics的功能。由于OC完全兼容C,调用底层函数不需要任何特殊语法,C语言里怎么写,照搬到OC代码就行了,非常方便。
Core Graphics函数设置阴影效果,UIImage绘图:
- /* 绘制logo */
- // 保存当前graphics context的状态
- CGContextSaveGState(currentContext);
- // 设置阴影效果
- CGContextSetShadow(currentContext, // 当前context
- CGSizeMake(4, 7), // 阴影的size
- 3); // 模糊度,非负数
-
- UIImage *logo = [UIImage imageNamed:@"logo.png"];
- CGRect logoFrame = CGRectMake(bounds.size.width / 4,
- bounds.size.height / 4,
- bounds.size.width / 2,
- bounds.size.height / 2);
- [logo drawInRect:logoFrame];
-
- // 恢复之前的graphics context
- CGContextRestoreGState(currentContext);
复制代码
UIBezier自定义渐变色显示范围,Core Graphics函数设置渐变色效果
- // 渐变色
- // 3色渐变
- CGFloat components[12] = {1.0, 0.0, 0.0, 1.0,
- 0.0, 1.0, 0.0, 1.0,
- 1.0, 1.0, 0.0, 1.0};
- CGFloat locations[3] = {0.333, 0.667, 1.0};
-
- CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
- /*
- * locations: 每种颜色在渐变轴上的相对位置
- * 2: locations参数提供了几个location
- */
- CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace,
- components,
- locations,
- 3);
-
- // 定义渐变轴(根据startPoint和endPoint的连线决定渐变延伸的方向)
- CGPoint startPoint = CGPointMake(bounds.size.width / 4,
- bounds.size.height / 4);
- CGPoint endPoint = CGPointMake(bounds.size.width / 4,
- bounds.size.height * 0.75);
-
- // 保存当前graphics context的状态
- CGContextSaveGState(currentContext);
- // 创建一个三角形路径
- UIBezierPath *trianglePath = [[UIBezierPath alloc] init];
- [trianglePath moveToPoint:CGPointMake(bounds.size.width / 2,
- bounds.size.height / 4)];
- [trianglePath addLineToPoint:CGPointMake(bounds.size.width / 4,
- bounds.size.height * 0.75)];
- [trianglePath addLineToPoint:CGPointMake(bounds.size.width * 0.75,
- bounds.size.height * 0.75)];
- [trianglePath addClip];
-
-
- CGContextDrawLinearGradient(currentContext,
- gradient,
- startPoint,
- endPoint, 0);
- // 释放内存
- CGColorSpaceRelease(colorSpace);
- CGGradientRelease(gradient);
复制代码
效果图:
阴影:
渐变
|
|