Quartz 2D
在iOS中常用的繪圖框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一個強大的二維圖像繪制引擎。Quartz 2D在UIKit中也有很好的封裝和集成,我們日常開發時所用到的UIKit中的組件都是由Core Graphics進行繪制的。不僅如此,當我們引入UIKit框架時系統會自動引入Core Graphics框架,並且為了方便開發者使用在UIKit內部還對一些常用的繪圖API進行了封裝。
在iOS中繪圖一般分為以下幾個步驟:
1.獲取繪圖上下文
2.創建並設置路徑
3.將路徑添加到上下文
4.設置上下文狀態
5.繪制路徑
6.釋放路徑
圖形上下文CGContextRef代表圖形輸出設備(也就是繪制的位置),包含了繪制圖形的一些設備信息,Quartz 2D中的所有對象最終都必須繪制到圖形上下文。這樣一來,我們在繪制圖形時就不必關心具體的設備信息,統一了代碼編寫方式(在Quartz 2D中的繪圖上下文可以是位圖Bitmap、PDF、窗口Window、層Layer、打印對象Printer)。
基本圖形繪制
在UIKit中默認已經為我們准備好了一個圖形上下文對象,在UI控件的drawRect:方法(這個方法在loadView、viewDidLoad方法後執行)中我們可以通過UIKit封裝函數UIGraphicsGetCurrentContext()方法獲得這個圖形上下文(注意在其他UI控件方法中無法取得這個對象),然後我們只要按照繪圖步驟一步步執行即可。下面自定義一個KCView繼承自UIView,重寫drawRect:方法繪制兩條直線說明上面繪圖的步驟:
KCView.m
//
// KCView.m
// Quartz2D
//
// Created by Kenshin Cui on 14-3-17.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//
/**
基本繪圖
*/
#import "KCView.h"
@implementation KCView
#pragma mark 繪圖
//繪圖只能在此方法中調用,否則無法得到當前圖形上下文
-(void)drawRect:(CGRect)rect{
//1.取得圖形上下文對象
CGContextRef context = UIGraphicsGetCurrentContext();
//2.創建路徑對象
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, nil, 20, 50);//移動到指定位置(設置路徑起點)
CGPathAddLineToPoint(path, nil, 20, 100);//繪制直線(從起始位置開始)
CGPathAddLineToPoint(path, nil, 300, 100);//繪制另外一條直線(從上一直線終點開始繪制)
//3.添加路徑到圖形上下文
CGContextAddPath(context, path);
//4.設置圖形上下文狀態屬性
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1);//設置筆觸顏色
CGContextSetRGBFillColor(context, 0, 1.0, 0, 1);//設置填充色
CGContextSetLineWidth(context, 2.0);//設置線條寬度
CGContextSetLineCap(context, kCGLineCapRound);//設置頂點樣式,(20,50)和(300,100)是頂點
CGContextSetLineJoin(context, kCGLineJoinRound);//設置連接點樣式,(20,100)是連接點
/*設置線段樣式
phase:虛線開始的位置
lengths:虛線長度間隔(例如下面的定義說明第一條線段長度8,然後間隔3重新繪制8點的長度線段,當然這個數組可以定義更多元素)
count:虛線數組元素個數
*/
CGFloat lengths[2] = { 18, 9 };
CGContextSetLineDash(context, 0, lengths, 2);
/*設置陰影
context:圖形上下文
offset:偏移量
blur:模糊度
color:陰影顏色
*/
CGColorRef color = [UIColor grayColor].CGColor;//顏色轉化,由於Quartz 2D跨平台,所以其中不能使用UIKit中的對象,但是UIkit提供了轉化方法
CGContextSetShadowWithColor(context, CGSizeMake(2, 2), 0.8, color);
//5.繪制圖像到指定圖形上下文
/*CGPathDrawingMode是填充方式,枚舉類型
kCGPathFill:只有填充(非零纏繞數填充),不繪制邊框
kCGPathEOFill:奇偶規則填充(多條路徑交叉時,奇數交叉填充,偶交叉不填充)
kCGPathStroke:只有邊框
kCGPathFillStroke:既有邊框又有填充
kCGPathEOFillStroke:奇偶填充並繪制邊框
*/
CGContextDrawPath(context, kCGPathFillStroke);//最後一個參數是填充類型
//6.釋放對象
CGPathRelease(path);
}
@end
在視圖控制器創建KCView並添加到根視圖中:
- (void)viewDidLoad {
[super viewDidLoad];
KCView *view=[[KCView alloc]initWithFrame:[UIScreen mainScreen].bounds];
view.backgroundColor=[UIColor whiteColor];
[self.view addSubview:view];
}