CGPath简单使用

// Quartz2D以及Core Animation所需要的头文件
#import <QuartzCore/QuartzCore.h>
 
@implementation MyQuartzView
 
- (id)initWithFrame:(CGRect)frame
{
     self = [super initWithFrame:frame];
     if  (self) {
         // Initialization code
     }
     return  self;
}
 
 
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- ( void )drawRect:(CGRect)rect
{
     // Drawing code
     
     // 创建Quartz上下文
     CGContextRef context = UIGraphicsGetCurrentContext();
     
     // 填充矩形
     CGContextSetRGBFillColor(context, 0.6f, 0.6f, 0.6f, 1.0f);
     CGContextFillRect(context, CGRectMake(0.0f, 0.0f, 320.0f, 460.0f));
     
     // 创建一个Path句柄
     CGMutablePathRef pathRef = CGPathCreateMutable();
     
     // 初始化该path到一个初始点
     CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);
     
     // 添加一条直线,从初始点到该函数指定的坐标点
     CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
     
     // 关闭该path
     CGPathCloseSubpath(pathRef);
     
     // 设置描边颜色
     CGContextSetRGBStrokeColor(context, 0.99f, 0.01f, 0.02f,1.0f);
     
     // 将此path添加到Quartz上下文中
     CGContextAddPath(context, pathRef);
     
     // 对上下文进行描边
     CGContextStrokePath(context);
     
     // 释放该path
     CGPathRelease(pathRef);
}
 
@end

 

Quartz2D中对Path的绘制过程与OpenVG几乎一样。首先是创建Path,然后是对Path做绘制描述,最后是绘制(Paint)Path。

以上要注意的是,创建完一个Path句柄后,必须调用一次CGPathMoveToPoint来初始化绘制的初始点。
 

在调用CGPathMoveToPoint后,它会终止当前的子Path,并重新开启一个子Path。而一个子Path,其默认行为会构成一个封闭图形,比如以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
// 创建一个Path句柄
CGMutablePathRef pathRef = CGPathCreateMutable();
 
// 初始化该path到一个初始点
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);
 
// 添加一条直线,从初始点到该函数指定的坐标点
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);
 
// 关闭该path
CGPathCloseSubpath(pathRef);

添加了两条直线,但是最终绘制出来的是一个封闭的三角形。

如果我们要画两条均以(0, 0)为其中一个端点的线段的话,我们可以这么做:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 创建一个Path句柄
CGMutablePathRef pathRef = CGPathCreateMutable();
 
// 初始化该path到一个初始点
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);
 
// 添加一条直线,从初始点到该函数指定的坐标点
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 0.0f, 0.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);
 
// 关闭该path
CGPathCloseSubpath(pathRef);

 

如果我们要从(0, 0)到(50, 100)画一条线段,然后再要从(50, 100)到(100, 50)画一条线段的话,可以这么做:

1
2
3
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值