Core Graphics 數組
知識補充
1.Core Graphics是基於C語言的一套框架,開發時沒法像使用Obj-C同樣調用;
2.在Quartz 2D中凡是使用帶有「Create」或者「Copy」關鍵字方法建立的對象,在使用後必定要使用對應的方法釋放(因爲這個框架基於C語言編寫沒法自動釋放內存);
3.Quartz 2D是跨平臺的,所以其中的方法中不能使用UIKit中的對象(UIKit只有iOS可用),例如用到的顏色只能用CGColorRef而不能用UIColor,可是UIKit中提供了對應的轉換方法;
4.在C語言中枚舉通常以「k」開頭,因爲Quartz 2D基於C語言開發,因此它也不例外(參數中不少枚舉都是k開頭的);
5.因爲Quartz 2D是Core Graphics的一部分,因此API多數以CG開頭;
6.在使用Quartz 2D繪圖API中全部以「Ref」結尾對象,在聲明時都沒必要聲明爲指針類型;
7.在使用Quartz 2D繪圖API時,凡是「UI」開頭的相關繪圖函數,都是UIKit對Core Graphics的封裝(主要爲了簡化繪圖操做);app
*Quartz 2D框架
Quartz 2D是CoreGraphics框架的一部分,是一個強大的二維圖像繪製引擎。在UIKit中也有很好的封裝和集成,平常開發時所用到的UIKit中的組件都是由CoreGraphics進行繪製,當咱們引入UIKit框架時系統會自動引入CoreGraphics框架,UIKit內部還對一些經常使用的繪圖API進行了封裝。ide
*基本圖形繪製函數
在UIKit中有一個默認的圖形上下文對象,在UI控件的drawRect:方法(這個方法在loadView、viewDidLoad方法後執行)中咱們能夠經過UIKit封裝函數UIGrahicsGetCurrentContext()方法得到這個圖形上下文(在其餘UI控件方法中沒法取得這個對象),自定義一個View繼承自UIView,重寫drawRect:方法繪製。字體
//基本繪圖,建立一個小三角
-(void)createTriangleBasicView{
//取得圖像上下文對象
CGContextRef context=UIGraphicsGetCurrentContext(); //建立路徑對象 CGMutablePathRef path=CGPathCreateMutable(); CGPathMoveToPoint(path, nil, 20, 50);//移動到指定位置(設置路徑起點) CGPathAddLineToPoint(path, nil, 20, 100);//繪製直線(從起始位置開始) CGPathAddLineToPoint(path, nil, 300, 100);//繪製另一條直線(從上一直線終點開始繪製) //添加到路徑圖形上下文 CGContextAddPath(context, path); //設置圖形上下文狀態屬性 CGContextSetRGBStrokeColor(context, 255/255.0f, 0, 0, 1);//設置筆觸顏色 CGContextSetRGBFillColor(context, 0, 255/255.0f, 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[]={18,9,9,4}; CGContextSetLineDash(context, 0, lengths, 4); /*設置陰影 context:圖形上下文 offset:偏移量 blur:模糊度 color:陰影顏色 */ CGColorRef color=[UIColor grayColor].CGColor;//;//顏色轉化,因爲Quartz 2D跨平臺,因此其中不能使用UIKit中的對象,可是UIkit提供了轉化方法 CGContextSetShadowWithColor(context, CGSizeMake(2, 2), 0.8, color); //繪製圖像到指定圖形上下文 /*CGPathDrawingMode是填充方式,枚舉類型 kCGPathFill:只有填充(非零纏繞數填充),不繪製邊框 kCGPathEOFill:奇偶規則填充(多條路徑交叉時,奇數交叉填充,偶交叉不填充) kCGPathStroke:只有邊框 kCGPathFillStroke:既有邊框又有填充 kCGPathEOFillStroke:奇偶填充並繪製邊框 */ CGContextDrawPath(context, kCGPathFillStroke); CGPathRelease(path); CGColorRelease(color); }
運行效果優化
*簡化繪圖方式ui
CoreGraphics內部對建立對象添加到上下文進行了封裝能夠一步完成,UIKit內部封裝了一些以「UI」開頭的方法能夠進行圖形繪製spa
//簡化繪圖,建立一個小三角
-(void)createTriangleSimplifyView{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //繪製路徑 CGContextMoveToPoint(context, 20, 50); CGContextAddLineToPoint(context, 20, 100); CGContextAddLineToPoint(context, 300, 100); //封閉路徑:a.建立一條起點和終點的線,不推薦 //CGPathAddLineToPoint(path, nil, 20, 50); //封閉路徑:b.直接調用路徑封閉方法 CGContextClosePath(context); //設置圖形上下文屬性 CGContextClosePath(context); [[UIColor redColor] setStroke];//設置紅色邊框 [[UIColor greenColor] setFill];//設置綠色填充 //繪製路徑 CGContextDrawPath(context, kCGPathFillStroke); }
運行效果指針
*繪製矩形
//繪製矩形
-(void)createRect{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); CGContextAddRect(context, CGRectMake(20, 50, 280.0, 50.0)); //設置屬性 [[UIColor blueColor] set]; CGContextDrawPath(context, kCGPathFillStroke); [[UIColor yellowColor] set]; UIRectFill(CGRectMake(20, 150, 280.0, 50.0));//繪製矩形(只有填充) [[UIColor redColor] setStroke]; UIRectFrame(CGRectMake(20, 250, 280.0, 50));//繪製矩形(只有邊框) }
運行效果
*繪製橢圓
//繪製橢圓
-(void)createEllipse{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //添加對象,繪製橢圓(圓形)的過程也是先建立一個矩形 CGContextAddEllipseInRect(context, CGRectMake(0, 0, 200, 200)); //設置屬性 [[UIColor purpleColor] set]; //繪製 CGContextDrawPath(context, kCGPathFillStroke); }
運行效果
*繪製弧形
//繪製弧形
-(void)createArcView{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); /*添加弧形對象 x:中心點x座標 y:中心點y座標 radius:半徑 startAngle:起始弧度 endAngle:終止弧度 closewise:是否逆時針繪製,0則順時針繪製 */ CGContextAddArc(context, 80, 80, 60, 0, M_PI_2, 1); //設置屬性 [[UIColor yellowColor] set]; //繪製 CGContextDrawPath(context, kCGPathFillStroke); }
運行效果
*繪製貝塞爾曲線
//繪製二次/三次貝塞爾曲線
-(void)createCurveView{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //繪製曲線 CGContextMoveToPoint(context, 20, 100);//移動到起始位置 /*繪製二次貝塞爾曲線 c:圖形上下文 cpx:控制點x座標 cpy:控制點y座標 x:結束點x座標 y:結束點y座標 */ CGContextAddQuadCurveToPoint(context, 160, 0, 300, 100); CGContextMoveToPoint(context, 20, 500); /*繪製三次貝塞爾曲線 c:圖形上下文 cp1x:第一個控制點x座標 cp1y:第一個控制點y座標 cp2x:第二個控制點x座標 cp2y:第二個控制點y座標 x:結束點x座標 y:結束點y座標 */ CGContextAddCurveToPoint(context, 80, 300, 240, 500, 300, 300); //設置圖形上下文屬性 [[UIColor yellowColor] setFill]; [[UIColor redColor] setStroke]; //繪製路徑 CGContextDrawPath(context, kCGPathFillStroke); }
運行效果
*文本繪製
//文本繪製
-(void)createTextView{
//繪製到指定內容區域
NSString *str=@"Star Walk is the most beautiful stargazing app you’ve ever seen on a mobile device. It will become your go-to interactive astro guide to the night sky, following your every movement in real-time and allowing you to explore over 200, 000 celestial bodies with extensive information about stars and constellations that you find."; UIFont *font=[UIFont systemFontOfSize:18];//設置字體 UIColor *color=[UIColor redColor];//字體顏色 NSMutableParagraphStyle *style=[[NSMutableParagraphStyle alloc] init];//段落樣式 NSTextAlignment align=NSTextAlignmentLeft;//對齊方式 style.alignment=align; [str drawInRect:CGRectMake(20, 50, 280, 300) withAttributes:@{NSFontAttributeName:font,NSForegroundColorAttributeName:color,NSParagraphStyleAttributeName:style}]; }
運行效果
*圖像繪製
//圖像繪製
-(void)createImgae{
UIImage *img=[UIImage imageNamed:@"🤤.png"]; //從某一點開始繪製 // [img drawAtPoint:CGPointMake(10, 50)]; //繪製到指定的矩形中,注意若是大小不合適會會進行拉伸 [img drawInRect:CGRectMake(10, 50, 256, 160)]; //平鋪繪製 // [img drawAsPatternInRect:CGRectMake(0, 0, 320, 568)]; }
運行效果
*繪製漸變填充
線性漸變線:漸變色以直線方式從開始位置逐漸向結束位置漸變
//線性漸變線:漸變色以直線方式從開始位置逐漸向結束位置漸變
-(void)createLinearGradient{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //使用rgb顏色空間 CGColorSpaceRef colorSpac=CGColorSpaceCreateDeviceRGB(); /*指定漸變色 space:顏色空間 components:顏色數組,注意因爲指定了RGB顏色空間,那麼四個數組元素表示一個顏色(red、green、blue、alpha), 若是有三個顏色則這個數組有4*3個元素 locations:顏色所在位置(範圍0~1),這個數組的個數不小於components中存放顏色的個數 count:漸變個數,等於locations的個數 */ CGFloat compoents[12]={ 248.0/255.0,86.0/255.0,86.0/255.0,1, 249.0/255.0,127.0/255.0,127.0/255.0,1, 1.0,1.0,1.0,1.0 }; CGFloat locations[3]={0,0.3,1.0}; CGGradientRef gradient=CGGradientCreateWithColorComponents(colorSpac, compoents, locations, 3); /*繪製線性漸變 context:圖形上下文 gradient:漸變色 startPoint:起始位置 endPoint:終止位置 options:繪製方式,kCGGradientDrawsBeforeStartLocation 開始位置以前就進行繪製,到結束位置以後再也不繪製, kCGGradientDrawsAfterEndLocation開始位置以前不進行繪製,到結束點以後繼續填充 */ CGContextDrawLinearGradient(context, gradient, CGPointMake(self.frame.size.width/2, 0), CGPointMake(self.frame.size.width/2, self.frame.size.height), kCGGradientDrawsAfterEndLocation); //釋放顏色空間 CGColorSpaceRelease(colorSpac); }
運行效果
徑向漸變:以中心點爲圓心從起始漸變色向四周輻射,直到終止漸變色
//徑向漸變:以中心點爲圓心從起始漸變色向四周輻射,直到終止漸變色
-(void)createRadialGradient{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //使用rgb顏色空間 CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); /*指定漸變色 space:顏色空間 components:顏色數組,注意因爲指定了RGB顏色空間,那麼四個數組元素表示一個顏色(red、green、blue、alpha), 若是有三個顏色則這個數組有4*3個元素 locations:顏色所在位置(範圍0~1),這個數組的個數不小於components中存放顏色的個數 count:漸變個數,等於locations的個數 */ CGFloat compoents[12]={ 248.0/255.0,86.0/255.0,86.0/255.0,1, 249.0/255.0,127.0/255.0,127.0/255.0,1, 1.0,1.0,1.0,1.0 }; CGFloat locations[3]={0,0.3,1.0}; CGGradientRef gradient=CGGradientCreateWithColorComponents(colorSpace, compoents, locations, 3); /*繪製徑向漸變 context:圖形上下文 gradient:漸變色 startCenter:起始點位置 startRadius:起始半徑(一般爲0,不然在此半徑範圍內容無任何填充) endCenter:終點位置(一般和起始點相同,不然會有偏移) endRadius:終點半徑(也就是漸變的擴散長度) options:繪製方式,kCGGradientDrawsBeforeStartLocation 開始位置以前就進行繪製,可是到結束位置以後再也不繪製, kCGGradientDrawsAfterEndLocation開始位置以前不進行繪製,但到結束點以後繼續填充 */ CGContextDrawRadialGradient(context, gradient, CGPointMake(self.frame.size.width/2, self.frame.size.height/2), 0, CGPointMake(self.frame.size.width/2, self.frame.size.height/2), 150, kCGGradientDrawsBeforeStartLocation); //釋放顏色空間 CGColorSpaceRelease(colorSpace); }
運行效果
*擴展--漸變填充
//區域裁剪線性漸變填充
-(void)createRectWithLinearGradientFill{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //使用rgb顏色空間 CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); //裁切處一塊矩形用於顯示,注意必須先裁切再調用漸變 //CGContextClipToRect(context, CGRectMake(20, 50, 280, 300)); //裁切還可使用UIKit中對應的方法 UIRectClip(CGRectMake(20, 50, 280, 300)); CGFloat compoents[12]={ 248.0/255.0,86.0/255.0,86.0/255.0,1, 249.0/255.0,127.0/255.0,127.0/255.0,1, 1.0,1.0,1.0,1.0 }; CGFloat locations[3]={0,0.3,1.0}; CGGradientRef gradient=CGGradientCreateWithColorComponents(colorSpace, compoents, locations, 3); CGContextDrawLinearGradient(context, gradient, CGPointMake(150, 50), CGPointMake(150, 300), kCGGradientDrawsAfterEndLocation); //釋放顏色空間 CGColorSpaceRelease(colorSpace); }
運行效果
*疊加模式
使用Quartz2D繪圖時後面繪製的圖像會覆蓋前面的,默認狀況下若是前面的被覆蓋後將看不到後面的內容,但Quartz2D中提供了填充模式供開發者配置調整。
//疊加模式,(視圖有背景色,和沒背景色是不同的)
-(void)createRectByUIKit{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); CGRect rect= CGRectMake(0, 130.0, 320.0, 50.0); CGRect rect1= CGRectMake(0, 390.0, 320.0, 50.0); CGRect rect2=CGRectMake(20, 50.0, 10.0, 250.0); CGRect rect3=CGRectMake(40.0, 50.0, 10.0, 250.0); CGRect rect4=CGRectMake(60.0, 50.0, 10.0, 250.0); CGRect rect5=CGRectMake(80.0, 50.0, 10.0, 250.0); CGRect rect6=CGRectMake(100.0, 50.0, 10.0, 250.0); CGRect rect7=CGRectMake(120.0, 50.0, 10.0, 250.0); CGRect rect8=CGRectMake(140.0, 50.0, 10.0, 250.0); CGRect rect9=CGRectMake(160.0, 50.0, 10.0, 250.0); CGRect rect10=CGRectMake(180.0, 50.0, 10.0, 250.0); CGRect rect11=CGRectMake(200.0, 50.0, 10.0, 250.0); CGRect rect12=CGRectMake(220.0, 50.0, 10.0, 250.0); CGRect rect13=CGRectMake(240.0, 50.0, 10.0, 250.0); CGRect rect14=CGRectMake(260.0, 50.0, 10.0, 250.0); CGRect rect15=CGRectMake(280.0, 50.0, 10.0, 250.0); CGRect rect16=CGRectMake(30.0, 310.0, 10.0, 250.0); CGRect rect17=CGRectMake(50.0, 310.0, 10.0, 250.0); CGRect rect18=CGRectMake(70.0, 310.0, 10.0, 250.0); CGRect rect19=CGRectMake(90.0, 310.0, 10.0, 250.0); CGRect rect20=CGRectMake(110.0, 310.0, 10.0, 250.0); CGRect rect21=CGRectMake(130.0, 310.0, 10.0, 250.0); CGRect rect22=CGRectMake(150.0, 310.0, 10.0, 250.0); CGRect rect23=CGRectMake(170.0, 310.0, 10.0, 250.0); CGRect rect24=CGRectMake(190.0, 310.0, 10.0, 250.0); CGRect rect25=CGRectMake(210.0, 310.0, 10.0, 250.0); CGRect rect26=CGRectMake(230.0, 310.0, 10.0, 250.0); CGRect rect27=CGRectMake(250.0, 310.0, 10.0, 250.0); CGRect rect28=CGRectMake(270.0, 310.0, 10.0, 250.0); CGRect rect29=CGRectMake(290.0, 310.0, 10.0, 250.0); [[UIColor yellowColor]set]; UIRectFill(rect); [[UIColor greenColor]setFill]; UIRectFill(rect1); [[UIColor redColor]setFill]; UIRectFillUsingBlendMode(rect2, kCGBlendModeClear); UIRectFillUsingBlendMode(rect3, kCGBlendModeColor); UIRectFillUsingBlendMode(rect4, kCGBlendModeColorBurn); UIRectFillUsingBlendMode(rect5, kCGBlendModeColorDodge); UIRectFillUsingBlendMode(rect6, kCGBlendModeCopy); UIRectFillUsingBlendMode(rect7, kCGBlendModeDarken); UIRectFillUsingBlendMode(rect8, kCGBlendModeDestinationAtop); UIRectFillUsingBlendMode(rect9, kCGBlendModeDestinationIn); UIRectFillUsingBlendMode(rect10, kCGBlendModeDestinationOut); UIRectFillUsingBlendMode(rect11, kCGBlendModeDestinationOver); UIRectFillUsingBlendMode(rect12, kCGBlendModeDifference); UIRectFillUsingBlendMode(rect13, kCGBlendModeExclusion); UIRectFillUsingBlendMode(rect14, kCGBlendModeHardLight); UIRectFillUsingBlendMode(rect15, kCGBlendModeHue); UIRectFillUsingBlendMode(rect16, kCGBlendModeLighten); UIRectFillUsingBlendMode(rect17, kCGBlendModeLuminosity); UIRectFillUsingBlendMode(rect18, kCGBlendModeMultiply); UIRectFillUsingBlendMode(rect19, kCGBlendModeNormal); UIRectFillUsingBlendMode(rect20, kCGBlendModeOverlay); UIRectFillUsingBlendMode(rect21, kCGBlendModePlusDarker); UIRectFillUsingBlendMode(rect22, kCGBlendModePlusLighter); UIRectFillUsingBlendMode(rect23, kCGBlendModeSaturation); UIRectFillUsingBlendMode(rect24, kCGBlendModeScreen); UIRectFillUsingBlendMode(rect25, kCGBlendModeSoftLight); UIRectFillUsingBlendMode(rect26, kCGBlendModeSourceAtop); UIRectFillUsingBlendMode(rect27, kCGBlendModeSourceIn); UIRectFillUsingBlendMode(rect28, kCGBlendModeSourceOut); UIRectFillUsingBlendMode(rect29, kCGBlendModeXOR); }
運行效果
*填充模式
按必定的自定義樣式進行填充,有點相似於貼瓷磚的方式
有顏色填充模式
//填充模式,有顏色填充模式
void drawColoredTile(void *info,CGContextRef context){
CGContextSetRGBFillColor(context, 254.0/255.0, 52.0/255.0, 90.0/255.0, 1); CGContextFillRect(context, CGRectMake(0, 0, 20, 20)); CGContextSetRGBFillColor(context, 187.0/255.0, 299.0/255.0, 299.0/255.0, 1); CGContextFillRect(context, CGRectMake(20, 20, 20, 20)); } -(void)createBackgroundWithColoredPattern{ //得到圖形上下文 CGContextRef context=UIGraphicsGetCurrentContext(); //模式填充顏色空間,注意對於有顏色填充模式,這裏傳NULL CGColorSpaceRef colorSpace=CGColorSpaceCreatePattern(NULL); //將填充顏色空間設置爲模式填充的顏色空間 CGContextSetFillColorSpace(context, colorSpace); //填充模式回調函數結構體 CGPatternCallbacks callback={0,&drawColoredTile,NULL}; /*填充模式 info://傳遞給callback的參數 bounds:瓷磚大小 matrix:形變 xStep:瓷磚橫向間距 yStep:瓷磚縱向間距 tiling:貼磚的方法 isClored:繪製的瓷磚是否已經指定了顏色(對於有顏色瓷磚此處指定位true) callbacks:回調函數 */ CGPatternRef pattern=CGPatternCreate(NULL, CGRectMake(0, 0, 2*20, 2*20), CGAffineTransformIdentity, 2*20, 2*20, kCGPatternTilingNoDistortion, true, &callback); CGFloat alpha=1; //注意最後一個參數對於有顏色瓷磚指定爲透明度的參數地址,對於無顏色瓷磚則指定當前顏色空間對應的顏色數組 CGContextSetFillPattern(context, pattern, &alpha); UIRectFill(self.frame); CGColorSpaceRelease(colorSpace); CGPatternRelease(pattern); }
運行效果
無顏色填充模式
//填充模式,無顏色填充
//填充瓷磚的回調函數(必須知足CGPatternCallbacks簽名)
void drawTile(void *info,CGContextRef context){
CGContextFillRect(context, CGRectMake(0, 0, 20, 20)); CGContextFillRect(context, CGRectMake(20, 20, 20, 20)); } -(void)createBackgroundWithPattern{ //得到圖形上下文 CGContextRef context=UIGraphicsGetCurrentContext(); //設備無關的顏色空間 CGColorSpaceRef rgbSpace=CGColorSpaceCreateDeviceRGB(); //模式填充顏色空間 CGColorSpaceRef colorSpace=CGColorSpaceCreatePattern(rgbSpace); //將填充顏色空間設置爲模式填充顏色空間 CGContextSetFillColorSpace(context, colorSpace); //填充模式回調函數結構體 CGPatternCallbacks callback={0,&drawTile,NULL}; /*填充模式 info://傳遞給callback的參數 bounds:瓷磚大小 matrix:形變 xStep:瓷磚橫向間距 yStep:瓷磚縱向間距 tiling:貼磚的方法(瓷磚擺放的方式) isClored:繪製的瓷磚是否已經指定了顏色(對於無顏色瓷磚此處指定位false) callbacks:回調函數 */ CGPatternRef pattern=CGPatternCreate(NULL, CGRectMake(0, 0, 2*20, 2*20), CGAffineTransformIdentity, 2*20, 2*20, kCGPatternTilingNoDistortion, false, &callback); CGFloat componets[]={254.0/255.0,52.0/255.0,90.0/255.0,1.0}; //注意最後一個參數對於無顏色填充模式指定爲當前顏色空間顏色數據 CGContextSetFillPattern(context, pattern, componets); UIRectFill(self.frame); CGColorSpaceRelease(rgbSpace); CGColorSpaceRelease(colorSpace); CGPatternRelease(pattern); }
運行效果
*上下文變換
//圖形上下文形變
-(void)createTranslate{
//得到圖形上下文
CGContextRef context=UIGraphicsGetCurrentContext(); //保持初始狀態 CGContextSaveGState(context); //形變第一步:圖形上下文向右平移100 CGContextTranslateCTM(context, 100, 200); //形變第二步:縮放0.8 CGContextScaleCTM(context, 0.7, -0.7); //形變第三步旋轉 CGContextRotateCTM(context, M_PI_4/4); UIImage *img=[UIImage imageNamed:@"🤤.png"]; //使用CoreGraphics繪製圖像 //在Core Graphics中座標系的y軸正方向是向上的,座標原點在屏幕左下角,y軸方向恰好和UIKit中y軸方向相反。其實圖形上下文只要沿着x軸旋轉180度,而後向上平移適當的高度便可 CGContextDrawImage(context, CGRectMake(10, 50, 256, 160), img.CGImage); //恢復到初始狀態 CGContextRestoreGState(context); }
運行效果
*視圖刷新
在UIView的drawRect:中繪製的圖形會在控件顯示的時候調用(並且顯示時會重繪全部圖形),有時會要求繪製內容的顯示是實時的,此時就要調用繪圖方法從新繪製。刷新繪圖內容須要調用setNeedsDisplay方法,不容許開發者直接調用drawRect:方法
*其餘圖形上下文
繪製到位圖
//利用位圖上下文繪製
-(void)createBitmapContext{
//得到一個位圖圖形上下文
CGSize size=CGSizeMake(250, 160);//畫布大小
UIGraphicsBeginImageContext(size); UIImage *img=[UIImage imageNamed:@"🤤.png"]; [img drawInRect:CGRectMake(0, 0, 250, 160)];//注意繪圖的位置是相對於布畫頂點而言,不是屏幕 //添加水印 CGContextRef context=UIGraphicsGetCurrentContext(); CGContextMoveToPoint(context, 150, 150); CGContextAddLineToPoint(context, 220, 150); [[UIColor cyanColor] setStroke]; CGContextSetLineWidth(context, 2); CGContextDrawPath(context, kCGPathStroke); NSString *str=@"Burning life"; [str drawInRect:CGRectMake(150, 130, 100, 30) withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Marker Felt" size:15],NSForegroundColorAttributeName:[UIColor cyanColor]}]; //返回繪製新的圖形 UIImage *newImage=UIGraphicsGetImageFromCurrentImageContext(); //關閉對應的上下文 UIGraphicsEndImageContext(); //繪製圖片到視圖 [newImage drawInRect:CGRectMake((self.frame.size.width-250)/2, (self.frame.size.height-160)/2, 250, 160)]; }
運行效果
繪製到PDF
繪製到PDF要啓用PDF圖形上下文,繪製到內容到PDF時須要建立分頁,每頁內容的開始都要調用一次UIGraphicsBeginPDFPage()方法
/繪製到pdf,繪製出的pdf能夠真機運行後使用iTools到app的Documents文件夾查看
-(void)createContentToPdfContext{ NSString *filePath=[NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"/Documents/%@",@"myPDF.pdf"]]; NSLog(@"%@",filePath); //啓用pdf圖形上下文 /** path:保存路徑 bounds:pdf文檔大小,若是設置爲CGRectZero則使用默認值:612*792 pageInfo:頁面設置,爲nil則不設置任何信息 */ UIGraphicsBeginPDFContextToFile(filePath, CGRectZero, [NSDictionary dictionaryWithObjectsAndKeys:@"Vie",kCGPDFContextAuthor, nil]); //因爲pdf文檔是分頁的,因此首先要建立一頁畫布供咱們繪製 UIGraphicsBeginPDFPage(); NSString *title=@"Welcome to Apple Support"; NSMutableParagraphStyle *style=[[NSMutableParagraphStyle alloc]init]; NSTextAlignment align=NSTextAlignmentCenter; style.alignment=align; [title drawInRect:CGRectMake(26, 20, 300, 50) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18],NSParagraphStyleAttributeName:style}]; NSString *content=@"Learn about Apple products, view online manuals, get the latest downloads, and more. Connect with other Apple users, or get service, support, and professional advice from Apple."; NSMutableParagraphStyle *style2=[[NSMutableParagraphStyle alloc]init]; style2.alignment=NSTextAlignmentLeft; // style2.firstLineHeadIndent=20; [content drawInRect:CGRectMake(26, 56, 300, 255) withAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15],NSForegroundColorAttributeName:[UIColor grayColor],NSParagraphStyleAttributeName:style2}]; UIImage *image=[UIImage imageNamed:@"🤤.png"]; [image drawInRect:CGRectMake(316, 20, 290, 305)]; UIImage *image2=[UIImage imageNamed:@"🤤.png"]; [image2 drawInRect:CGRectMake(6, 320, 600, 281)]; //建立新的一頁繼續繪製其餘內容 UIGraphicsBeginPDFPage(); UIImage *image3=[UIImage imageNamed:@"🤤.png"]; [image3 drawInRect:CGRectMake(6, 20, 600, 629)]; //結束pdf上下文 UIGraphicsEndPDFContext(); }
*CoreImage
iOS5.0開始提供了CoreImage框架來進行濾鏡特效製做
CIContext:圖像上下文,用於管理整個圖片處理過程,不一樣的圖形上下文將利用不一樣的圖像處理硬件進行圖像處理(在iOS中能夠經過不一樣的方式建立圖像上下文,例如能夠建立基於CPU的圖像上下方、建立基於GPU的圖像上下方以及建立OpenGL優化過的圖像上下文)。
CIFilter:圖像處理濾鏡,每種濾鏡有不一樣的參數設置。
CIImage:Core Image框架中的圖像類型,主要用於輸入和輸出圖像。
//圖像濾鏡處理
-(void)showAllFilters{
#pragma mark 查看全部內置濾鏡 NSArray *filterNames=[CIFilter filterNamesInCategory:kCICategoryBuiltIn]; for (NSString *filterName in filterNames) { CIFilter *filter=[CIFilter filterWithName:filterName]; NSLog(@"\rfilter:%@\rattributes:%@",filterName,[filter attributes]); } CIContext *context;//Core Image上下文 CIImage *image;//咱們要編輯的圖像 CIImage *outputImage;//處理後的圖像 CIFilter *colorControlsFilter;//色彩濾鏡 context=[CIContext contextWithOptions:nil];//使用GPU渲染,推薦,但注意GPU的CIContext沒法跨應用訪問,例如直接在UIImagePickerController的完成方法中調用上下文處理就會自動降級爲CPU渲染,因此推薦如今完成方法中保存圖像,而後在主程序中調用 //初始化CIImage源圖像 image=[CIImage imageWithCGImage:[UIImage imageNamed:@"🤤.png"].CGImage]; //取得濾鏡 colorControlsFilter=[CIFilter filterWithName:@"CIColorControls"]; [colorControlsFilter setValue:image forKey:@"inputImage"];//設置濾鏡的輸入圖片 //調整飽和度 [colorControlsFilter setValue:[NSNumber numberWithFloat:0.8] forKey:@"inputSaturation"];//設置濾鏡參數 //調整亮度 [colorControlsFilter setValue:[NSNumber numberWithFloat:0.1] forKey:@"inputBrightness"]; //調整對比度 [colorControlsFilter setValue:[NSNumber numberWithFloat:0.8] forKey:@"inputContrast"]; //轉換圖片 outputImage= [colorControlsFilter outputImage];//取得輸出圖像 CGImageRef temp=[context createCGImage:outputImage fromRect:[outputImage extent]]; UIImage *outImg=[UIImage imageWithCGImage:temp]; [outImg drawInRect:CGRectMake(0, 0, 250, 160)]; CGImageRelease(temp);//釋放CGImage對象 }
運行效果