1. Quartz概述編程
Quartz是Mac OS X的Darwin核心之上的繪圖層,有時候也認爲是CoreGraphics(製圖)。數組
共有兩種部分組成Quartz:框架
Quartz Compositor,合成視窗系統,管理和合成幕後視窗影像來創建Mac OS X使用者接口。(瞭解,即幕後工做)編程語言
Quartz 2D,是iOS和Mac OS X環境下的二維繪圖引擎。(熟練,幕前工做,由咱們來操做的)函數
涉及內容包括:基於路徑的繪圖,透明度繪圖,遮蓋,陰影,透明層,顏色管理,防鋸齒渲染,生成PDF,以及PDF元數據相關處理字體
2. 繪製基本幾何圖形spa
視圖繪製htm
在iOS上,全部的繪製,不管是否採用OpenGL、Quartz、UIKit、或者 Core Animation—都發生在UIView對象的區域內。對象
視圖定義繪製發生的屏幕區域。若是您使用系統提供的視圖,繪製工做會自動獲得處理(之前使用的UIView就是)。然而,若是您定義本身的定製視圖,則必須自行提供繪製代碼(今天要作的)。接口
ps:
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平臺的編程接口規格的專業的圖形程序接口。它用於三維圖像(二維的亦可),是一個功能強大,調用方便的底層圖形庫。2d遊戲圖形引擎用的就是它
視圖繪製週期
iPhone的繪圖操做是在UIView類的drawRect方法中完成的,因此若是咱們要想在一個UIView中繪圖,須要寫一個擴展UIView 的類,並重寫drawRect方法,在這裏進行繪圖操做,程序會自動調用此方法進行繪圖。
描繪系統會調用UIView對象的drawRect:方法,並向它傳入一個包含須要重畫的視圖區域的矩形。
在UIView中,重寫drawRect: (CGRect) aRect方法,能夠本身定義想要畫的圖案.且此方法通常狀況下只會畫一次.也就是說這個drawRect方法通常狀況下只會被調用一次.
1.drawRect調用是在Controller->loadView, Controller->viewDidLoad 兩方法以後掉用的.因此不用擔憂在控制器中這些View的drawRect就開始畫了.這樣能夠在控制器中設置一些值給View(若是這些View draw的時候須要用到某些變量值).
2.若是在UIView初始化時沒有設置rect大小,將直接致使drawRect不被自動調用。
3.當某些狀況下想要手動重畫這個View,只須要掉用[self setNeedsDisplay]方法便可.
setNeedsDisplay會調自動調用drawRect方法,這樣能夠拿到 UIGraphicsGetCurrentContext,就能夠畫畫了。
圖形上下文
在調用您提供的drawRect:方法以前,視圖對象會自動配置其繪製環境,使您的代碼能夠當即進行繪製。做爲這些
配置的一部分,UIView對象會爲當前繪製環境建立一個圖形上下文(對應於CGContextRef封裝類型)。
該圖形上下文包含繪製系統執行後續繪製命令所須要的信息,定義了各類基本的繪製屬性,好比繪製使用的顏色、
裁剪區域、線的寬度及風格信息、字體信息、合成選項、以及幾個其它信息。
繪製路徑
路徑用於描述由一序列線和Bézier曲線構成的2D幾何形狀。Core Graphics中也有一些用於建立簡單路徑(好比矩形和橢圓形)的便利函數。對於更爲複雜的路徑,必須用Core Graphics框架提供的函數自行建立。
//1.畫線段
// [self drawLine:contenxtRef];
//2.畫三角形
// [self drawTriangle:contenxtRef];
//3.畫矩形
// [self drawRectWithContextRef:contenxtRef];
//4.畫圓
// [self drawCircle:contenxtRef];
//5.扇形
// [self drawArc:contenxtRef];
//6.曲線(貝塞爾曲線)
貝塞爾曲線:
Bézier曲線是法國數學家「貝塞爾」在工做中發現,任何一條曲線均可以經過與它相切的控制線兩端的點的位置來定義。
是應用於二維圖形應用程序的數學曲線。
也就是說,給個起點和終點,使用控制點就能肯定一條曲線
3. 繪製圖像和文本
UIImages的-drawRect:方法繪製圖像:
- [UIImage drawAtPoint:(CGPoint)point]
- [UIImage drawInRect:(CGRect)rect]
- [UIImage drawAsPatternInRect:(CGRect)rect]
NSString的-drawRect:方法繪製文本:
- (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs
- (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs
API整理
- CGContextRef context = UIGraphicsGetCurrentContext(); 設置上下文
- CGContextMoveToPoint 開始畫線
- CGContextAddLineToPoint 畫直線
-
- CGContextAddEllipseInRect 畫一橢圓
- CGContextSetLineCap 設置線條終點形狀
- CGContextSetLineDash 畫虛線
- CGContextAddRect 畫一方框
- CGContextStrokeRect 指定矩形
- CGContextStrokeRectWithWidth 指定矩形線寬度
- CGContextStrokeLineSegments 一些直線
-
- CGContextAddArc 畫已曲線 前倆店爲中心 中間倆店爲起始弧度 最後一數據爲0則順時針畫 1則逆時針
- CGContextAddArcToPoint(context,0,0, 2, 9, 40);//先畫倆條線從point 到 弟1點 , 從弟1點到弟2點的線 切割裏面的圓
- CGContextSetShadowWithColor 設置陰影
- CGContextSetRGBFillColor 這隻填充顏色
- CGContextSetRGBStrokeColor 畫筆顏色設置
- CGContextSetFillColorSpace 顏色空間填充
- CGConextSetStrokeColorSpace 顏色空間畫筆設置
- CGContextFillRect 補充當前填充顏色的rect
- CGContextSetAlaha 透明度
-
- CGContextTranslateCTM 改變畫布位置
- CGContextSetLineWidth 設置線的寬度
- CGContextAddRects 畫多個線
- CGContextAddQuadCurveToPoint 畫曲線
- CGContextStrokePath 開始繪製圖片
- CGContextDrawPath 設置繪製模式
- CGContextClosePath 封閉當前線路
- CGContextTranslateCTM(context, 0, rect.size.height); CGContextScaleCTM(context, 1.0, -1.0);反轉畫布
- CGContextSetInterpolationQuality 背景內置顏色質量等級
- CGImageCreateWithImageInRect 從原圖片中取小圖
-
- //字符串的 寫入可用 nsstring自己的畫圖方法
- -(CGSize)drawInRect:(CGRect)rect
- withFont:(UIFont *)font
- lineBreakMode:(UILineBreakMode)lineBreakMode
- alignment:(UITextAlignment)alignment;來寫進去便可
-
- //對圖片放大縮小的功能就是慢了點
- UIGraphicsBeginImageContext(newSize);
- UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
-
- CGColorGetComponents() 返回顏色的各個直 以及透明度 可用只讀const float 來接收 是個數組
-
- //畫圖片
- CGImageRef image=CGImageRetain(img.CGImage);
- CGContextDrawImage(context, CGRectMake(10.0, height - 100.0, 90.0, 90.0), image);
-
- //實現逐變顏色填充方法 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);
-
- //注: 畫完圖後,必須
- 先用CGContextStrokePath來描線,即形狀
- 後用CGContextFillPath來填充形狀內的顏色.
-
- //填充一個路徑的時候,路徑裏面的子路徑都是獨立填充的。
- //假如是重疊的路徑,決定一個點是否被填充,有兩種規則
- 1,nonzero winding number rule:非零繞數規則,假如一個點被從左到右跨過,計數器+1,從右到左跨過,計數器-1,最後,若是結果是0,那麼不填充,若是是非零,那麼填充。
- 2,even-odd rule: 奇偶規則,假如一個點被跨過,那麼+1,最後是奇數,那麼要被填充,偶數則不填充,和方向沒有關係。
-
-
- 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 混合倆種顏色