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]; }