quartz 是主要的描畫接口,支持基於路徑的描畫、
抗鋸齒渲染、漸變填充模式、圖像、顏色、座標空間變換、以及PDF 文檔的創建、顯示、和分析。UIKit 爲Quartz 的圖像和顏色操作提供了Objective-C 的封裝。Core Animation 爲很多UIKit 的視圖屬性聲明的動畫效果提供底層支持,也可以用於實現定製的動畫。
在調用您提供的drawRect:方法之前,視圖對象會自動配置其描畫環境,使您的代碼可以立即進行描畫。作爲這些配置的一部分,UIView 對象會爲當前描畫環境創建一個圖形上下文(對應於CGContextRef 封裝類型)
用戶座標空間是您發出的所有描畫命令的工作環境。該空間的單位由點來表示。設備座標空間指的是設備內在的座標空間,由像素來表示。缺省情況下,用戶座標空間上的一個點等於設備座標空間的一個像素,這意味着一個點等於1/160英寸。然而,您不應該假定這個比例總是1:1。
UIColor 對象提供了一些便利方法,用於通過RGB、HSB、和灰度值指定顏色值。
您也可以使用Core Graphics 框架中的CGContextSetRGBStrokeColor 和
CGContextSetRGBFillColor 函數來創建和設置顏色。
路徑輪廓可以用像CGContextStrokePath 這樣的函數來畫,即用當前的筆劃顏色畫出以路徑爲中心位置的線。路徑的填充則可以用CGContextFillPath 函數來實現,它的功能是用當前的填充顏色或樣式填充路徑線段包圍的區域。
獲取上下文,圖形上下文是什麼意思?
CGContextRef context = UIGraphicsGetCurrentContext();
畫一個正方形圖形 沒有邊框
CGContextSetRGBFillColor(context, 0, 0.25, 0, 0.5);
CGContextFillRect(context, CGRectMake(2, 2, 270, 270));
CGContextStrokePath(context);
寫文字
CGContextSetLineWidth(context, 1.0);
CGContextSetRGBFillColor (context, 1, 1, 1, 1.0);
UIFont *font = [UIFont boldSystemFontOfSize:11.0];
[@"fangyp" drawInRect:CGRectMake(40, 40, 80, 20) withFont:font];
畫一條線
CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//線條顏色
CGContextMoveToPoint(context, 20, 20);
CGContextAddLineToPoint(context, 200,20);
CGContextStrokePath(context);
畫正方形邊框
CGContextSetRGBStrokeColor(context, 1, 1.0, 1.0, 1.0);
CGContextSetLineWidth(context, 2.0);
CGContextAddRect(context, CGRectMake(2, 2, 270, 270));
CGContextStrokePath(context);
畫方形背景顏色
UIGraphicsPopContext();
1、畫線:在uiview類裏重寫下面方法
-(void)drawRect:(CGRect)rect
{
//畫線
// UIColor*aColor = [UIColor colorWithRed:0 green:1.0 blue:0 alpha:0];
CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);
// CGContextSetFillColorWithColor(context, aColor.CGColor);
CGContextSetLineWidth(context, 4.0);
CGPointaPoints[5];
aPoints[0] =CGPointMake(60, 60);
aPoints[1] =CGPointMake(260, 60);
aPoints[2] =CGPointMake(260, 300);
aPoints[3] =CGPointMake(60, 300);
aPoints[4] =CGPointMake(60, 60);
CGContextAddLines(context, aPoints, 5);
CGContextDrawPath(context, kCGPathStroke); //開始畫線
//橢圓
CGRect aRect= CGRectMake(80, 80, 160, 100);
CGContextSetRGBStrokeColor(context, 0.6, 0.9, 0, 1.0);
CGContextSetLineWidth(context, 3.0);
// CGContextSetFillColorWithColor(context, aColor.CGColor);
// CGContextAddRect(context, rect); //矩形
CGContextAddEllipseInRect(context, aRect); //橢圓
CGContextDrawPath(context, kCGPathStroke);
2、弧線 CGContextAddArcToPoint與CGContextAddArc
void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)
x,y爲圓點座標,startAngle爲開始的弧度,endAngle爲 結束的弧度,clockwise 0爲順時針,1爲逆時針。
以下是示例代碼。
CGContextBeginPath(context);
CGContextSetRGBStrokeColor(context, 0, 1, 0, 1);
CGContextAddArc(context, 100, 100, 50, 180* PI/ 180, 270* PI/ 180,0); CGContextStrokePath(context);
void CGContextAddArcToPoint(CGContextRef c,CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2,CGFloat radius);
首先使用該函數繪製圓弧前,首先要確定一個start point.
CGContextMoveToPoint(context, 100, 100);
然後設置CGContextAddArcToPoint(context, 50, 100, 50, 150, 50);
這裏是從起始點100,100開始到第一個點50,100畫一條線段,然後再從第一個點50,100到第二點150,50畫另一條線段(這是兩條相交切線),然後設置半徑爲50.通過相交的兩條線段和半徑就可以確定圓弧了。
示例代碼如下:
CGContextBeginPath(context);
CGContextSetRGBStrokeColor(context, 0, 0, 1, 1);
CGContextMoveToPoint(context, 100, 100);
CGContextAddArcToPoint(context, 50, 100, 50, 150, 50);
CGContextStrokePath(context);
注意:Path被繪製後,當前點的座標更改爲150,50
0 CGContextRef context = UIGraphicsGetCurrentContext(); 設置上下文
1 CGContextMoveToPoint 開始畫線
2 CGContextAddLineToPoint 畫直線
4 CGContextAddEllipseInRect 畫一橢圓
4 CGContextSetLineCap 設置線條終點形狀
4 CGContextSetLineDash 畫虛線
4 CGContextAddRect 畫一方框
4 CGContextStrokeRect 指定矩形
4 CGContextStrokeRectWithWidth 指定矩形線寬度
4 CGContextStrokeLineSegments 一些直線
5 CGContextAddArc 畫已曲線 前倆店爲中心 中間倆店爲起始弧度 最後一數據爲0則順時針畫 1則逆時針
5 CGContextAddArcToPoint(context,0,0, 2, 9, 40);//先畫倆條線從point 到 弟1點 , 從弟1點到弟2點的線 切割裏面的圓
6 CGContextSetShadowWithColor 設置陰影
7 CGContextSetRGBFillColor 這隻填充顏色
7 CGContextSetRGBStrokeColor 畫筆顏色設置
7 CGContextSetFillColorSpace 顏色空間填充
7 CGConextSetStrokeColorSpace 顏色空間畫筆設置
8 CGContextFillRect 補充當前填充顏色的rect
8 CGContextSetAlaha 透明度
9 CGContextTranslateCTM 改變畫布位置
10 CGContextSetLineWidth 設置線的寬度
11 CGContextAddRects 畫多個線
12 CGContextAddQuadCurveToPoint 畫曲線
13 CGContextStrokePath 開始繪製圖片
13 CGContextDrawPath 設置繪製模式
14 CGContextClosePath 封閉當前線路
15 CGContextTranslateCTM(context, 0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0);反轉畫布
16 CGContextSetInterpolationQuality 背景內置顏色質量等級
16 CGImageCreateWithImageInRect 從原圖片中取小圖
17 字符串的 寫入可用 nsstring本身的畫圖方法 - (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode alignment:(UITextAlignment)alignment;來寫進去即可
18對圖片放大縮小的功能就是慢了點
UIGraphicsBeginImageContext(newSize);
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
19 CGColorGetComponents() 返回顏色的各個直 以及透明度 可用只讀const float 來接收 是個數組
20 畫圖片 CGImageRef image=CGImageRetain(img.CGImage);
CGContextDrawImage(context, CGRectMake(10.0, height -
100.0, 90.0, 90.0), image);
21 實現逐變顏色填充方法 CGContextClip(context);
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] =
{
204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,
29.0 / 255.0, 156.0 / 255.0, 215.0 / 255.0, 1.00,
0.0 / 255.0, 50.0 / 255.0, 126.0 / 255.0, 1.00,
};
CGGradientRef gradient = CGGradientCreateWithColorComponents
(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
CGColorSpaceRelease(rgb);
CGContextDrawLinearGradient(context, gradient,CGPointMake
(0.0,0.0) ,CGPointMake(0.0,self.frame.size.height),
kCGGradientDrawsBeforeStartLocation);
22 注: 畫完圖後,必須
先用CGContextStrokePath來描線,即形狀
後用CGContextFillPath來填充形狀內的顏色.
填充一個路徑的時候,路徑裏面的子路徑都是獨立填充的。
假如是重疊的路徑,決定一個點是否被填充,有兩種規則
1,nonzero winding number rule:非零繞數規則,假如一個點被從左到右跨過,計數器+1,從右到左跨過,計數器-1,最後,如果結果是0,那麼不填充,如果是非零,那麼填充。
2,even-odd rule: 奇偶規則,假如一個點被跨過,那麼+1,最後是奇數,那麼要被填充,偶數則不填充,和方向沒有關係。
Function
Description
CGContextEOFillPath
使用奇偶規則填充當前路徑
CGContextFillPath
使用非零繞數規則填充當前路徑
CGContextFillRect
填充指定的矩形
CGContextFillRects
填充指定的一些矩形
CGContextFillEllipseInRect
填充指定矩形中的橢圓
CGContextDrawPath
兩個參數決定填充規則,kCGPathFill表示用非零繞數規則,kCGPathEOFill表示用奇偶規則,kCGPathFillStroke表示填充,kCGPathEOFillStroke表示描線,不是填充
設置當一個顏色覆蓋上另外一個顏色,兩個顏色怎麼混合
默認方式是
result = (alpha * foreground) + (1 - alpha) * background
CGContextSetBlendMode :設置blend mode.
CGContextSaveGState :保存blend mode.
CGContextRestoreGState:在沒有保存之前,用這個函數還原blend mode.
CGContextSetBlendMode 混合倆種顏色
http://www.cocoachina.com/bbs/read.php?tid=75122&page=1