// // 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);