//
// 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做繪制描述,最后是繪制(Paint)Path。
以上要注意的是,創建完一個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);
