iOS开发中CoreGraphics绘图全解析
立即解锁
发布时间: 2025-08-20 01:38:26 阅读量: 1 订阅数: 6 


iOS 7开发入门:探索iOS SDK
### iOS 开发中 Core Graphics 绘图全解析
#### 1. 颜色理论基础
在现代计算机图形学中,屏幕上显示的任何颜色的数据都是基于某种颜色模型存储的。颜色模型(有时也称为颜色空间)是将现实世界的颜色表示为计算机可以使用的数字值的一种方式。一种常见的表示颜色的方法是使用四个分量:红色(R)、绿色(G)、蓝色(B)和透明度(alpha)。在 Quartz 中,每个值都表示为 CGFloat(一个 4 字节的浮点值,与 float 相同),这些值应始终在 0.0 到 1.0 之间。
- **RGB 颜色模型**:红色、绿色和蓝色分量代表加色原色,即 RGB 颜色模型。如果将这三种颜色的光按相等比例混合,根据混合光的强度,结果在人眼中会呈现为白色或灰色。以不同比例组合这三种加色原色可以得到一系列不同的颜色,称为色域。
- **RYB 颜色模型**:在小学时,我们可能学过原色是红色、黄色和蓝色,这被称为历史减色原色,即 RYB 颜色模型。但在现代颜色理论中,它的应用很少,在计算机图形学中几乎从不使用。因为 RYB 颜色模型的色域比 RGB 颜色模型要有限得多,而且也不容易用数学方法定义。
除了红、绿、蓝,Quartz 还使用了另一个颜色分量——alpha,它表示颜色的透明度。当在一种颜色上绘制另一种颜色时,alpha 用于确定最终绘制的颜色。当 alpha 为 1.0 时,绘制的颜色是 100% 不透明的,会遮挡下面的任何颜色;当 alpha 小于 1.0 时,下面的颜色会透过来并与上面的颜色混合;当 alpha 为 0.0 时,该颜色将完全不可见,后面的内容会完全显示出来。当使用 alpha 分量时,颜色模型有时被称为 RGBA 颜色模型,但严格来说,alpha 并不真正属于颜色,它只是定义了颜色在绘制时与其他颜色的交互方式。
#### 2. 其他颜色模型
虽然 RGB 模型是计算机图形学中最常用的颜色模型,但它并不是唯一的。还有其他几种颜色模型正在使用,包括:
- **Hue, saturation, value (HSV)**
- **Hue, saturation, lightness (HSL)**
- **Cyan, magenta, yellow, black (CMYK)**:用于四色胶印
- **Grayscale**
更复杂的是,其中一些模型还有不同的版本,包括 RGB 颜色空间的几个变体。幸运的是,对于大多数操作,我们不需要担心正在使用的颜色模型。我们可以直接在 UIColor 对象上调用 CGColor,在大多数情况下,Core Graphics 会处理任何必要的转换。
#### 3. 颜色便捷方法
UIColor 有大量的便捷方法,这些方法返回初始化为特定颜色的 UIColor 对象。例如,我们可以使用 redColor 方法将颜色初始化为红色。大多数这些便捷方法创建的 UIColor 实例都使用 RGBA 颜色模型,唯一的例外是表示灰度值的预定义 UIColor,如 blackColor、whiteColor 和 darkGrayColor,它们仅根据白色级别和 alpha 来定义。如果需要对颜色进行更多控制,可以通过指定所有四个分量来创建颜色,示例代码如下:
```objc
UIColor *red = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
```
#### 4. 在上下文中绘制图像
Quartz 允许直接在上下文中绘制图像。UIImage 类是一个 Objective - C 类,可作为使用 Core Graphics 数据结构(CGImage)的替代方案。UIImage 类包含将其图像绘制到当前上下文的方法。可以使用以下两种技术之一来确定图像在上下文中的显示位置:
- 指定一个 CGPoint 来标识图像的左上角。
- 指定一个 CGRect 来框定图像,必要时调整大小以适应框架。
示例代码如下:
```objc
UIImage *image; // 假设这个变量存在并指向一个 UIImage 实例
CGPoint drawPoint = CGPointMake(100.0, 100.0);
[image drawAtPoint:drawPoint];
```
#### 5. 绘制形状:多边形、线条和曲线
Quartz 提供了许多函数,使创建复杂形状变得更加容易。要绘制矩形或多边形,无需计算角度、绘制线条或进行任何数学运算,只需调用 Quartz 函数即可。例如,要绘制椭圆,可以定义椭圆需要适应的矩形,然后让 Core Graphics 完成工作,示例代码如下:
```objc
CGRect theRect = CGRectMake(0, 0, 100, 100);
CGContextAddEllipseInRect(context, theRect);
CGContextDrawPath(context, kCGPathFillStroke);
```
对于矩形也可以使用类似的方法。Quartz 还提供了创建更复杂形状的方法,如圆弧和贝塞尔路径。
#### 6. Quartz 2D 工具示例
Quartz 提供了一系列令人印象深刻的工具。例如,Quartz 不仅支持用纯色填充多边形,还支持用渐变填充。除了绘制实线,它还可以使用各种虚线模式。
#### 7. QuartzFun 应用程序概述
接下来要构建一个简单的绘图程序,该应用程序顶部和底部各有一个分段控件。顶部的控件用于更改绘图颜色,底部的控件用于更改要绘制的形状。当触摸并拖动时,将以所选颜色绘制所选形状。为了降低应用程序的复杂性,一次只绘制一个形状。
#### 8. 设置 QuartzFun 应用程序
在 Xcode 中,使用单视图应用程序模板创建一个新的 iPhone 项目,并将其命名为 QuartzFun。由于要在自定义视图中执行自定义绘图,因此需要创建一个 UIView 的子类,通过重写 drawRect: 方法来进行绘图。具体操作步骤如下:
1. 选择 QuartzFun 文件夹,按 ⌘ + N 调出新建文件助手,从 Cocoa Touch 部分选择 Objective - C 类,将新类命名为 BIDQuartzFunView,并使其成为 UIView 的子类。
2. 再次选择 QuartzFun 组,按 ⌘ + N 调出新建文件助手,从 C 和 C++ 标题中选择头文件模板,将文件命名为 BIDConstants.h。
3. 由于 UIColor 没有返回随机颜色的方法,我们需要编写代码来实现。为了遵循良好的编程实践,将代码放在 UIColor 的一个类别中。选择 QuartzFun 文件夹,按 ⌘ + N 调出新建文件助手,从 Cocoa Touch 标题中选择 Objective - C 类别,将类别命名为 BIDRandom,并使其成为 UIColor 的类别,然后将文件保存到项目文件夹中。
#### 9. 创建随机颜色
在 UIColor+BIDRandom.h 文件中添加以下代码:
```objc
#import <UIKit/UIKit.h>
@interface UIColor (BIDRandom)
+ (UIColor *)randomColor;
@end
```
在 UIColor+BIDRandom.m 文件中添加以下代码:
```objc
#import "UIColor+BIDRandom.h"
#define ARC4RANDOM_MAX 0x100000000LL
@implementation UIColor (BIDRandom)
+ (UIColor *)randomColor {
CGFloat red = (CGFloat)arc4random() / (CGFloat)ARC4RANDOM_MAX;
CGFloat blue = (CGFloat)arc4random() / (CGFloat)ARC4RANDOM_MAX;
CGFloat green = (CGFloat)arc4random() / (CGFloat)ARC4RANDOM_MAX;
retur
```
0
0
复制全文
相关推荐










