Quartz2D之Path使用初步

我们直接看以下代码:

//
//  MyQuartzView.m
//  QuartzTest
//
//  Created by zenny_chen on 12-2-21.
//  Copyright (c) 2012年 GreenGames Studio. All rights reserved.
//
 
#import "MyQuartzView.h"
 
// 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 做绘制描述,最后是 绘制PaintPath

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

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

// 创建一个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) 为其中一个端点的线段的话,我们可以这么做:

// 创建一个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) 画一条线段的话,可以这么做:

CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathMoveToPoint(pathRef, &CGAffineTransformIdentity, 50.0f, 100.0f);
CGPathAddLineToPoint(pathRef, &CGAffineTransformIdentity, 100.0f, 50.0f);

各位可以看看效果。

你可能感兴趣的:(macOS,iOS与Cocoa,Framework,ios,cocoa)