【Objective-C筆記】—— 視圖和Core Graphics

bounds和frame

bounds表示的矩形位于自己的坐標(biāo)系,frame表示的矩形位于父視圖的坐標(biāo)系,但是兩個(gè)矩形的大小是相同的。(bounds.origin.xbounds.origin.y始終未0)
frame用于確定與視圖層次結(jié)構(gòu)中其他視圖的相對(duì)位置,從而將自己的圖層與其他視圖的圖層正確組合成屏幕的圖像
bounds用于確定繪制區(qū)域,避免將自己繪制到圖層邊界之外

Core Graphics

Core Graphics是一套提供2D繪圖功能的C語言API。使用C語言的結(jié)構(gòu)和函數(shù)模擬了一套面向?qū)ο蟮木幊虣C(jī)制
Core Graphics中最重要的對(duì)象是圖形上下文(graphics context),圖形上下文是CGContextRef結(jié)構(gòu)的對(duì)象,負(fù)責(zé)存儲(chǔ)繪畫狀態(tài)(如畫筆顏色、線條粗細(xì))和繪制內(nèi)容所在的內(nèi)存空間

視圖的drawRect:方法在執(zhí)行之前,系統(tǒng)首先為視圖的圖層創(chuàng)建一個(gè)圖形上下文,然后為繪畫狀態(tài)設(shè)置一些默認(rèn)參數(shù)。drawRect:方法開始執(zhí)行時(shí),隨著圖形上下文不斷執(zhí)行繪圖操作,圖層上的內(nèi)容隨之改變。drawRect:執(zhí)行完畢后,系統(tǒng)將圖層與其他圖層一起組合成完整的圖像并顯示在屏幕上

objective-c實(shí)現(xiàn)

[[UIColor colorWithRed:1.0 green:0.0 blue:1.0 alpha:1.0] setStroke];
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:a];
[path addLineToPoint:b];
[path stroke];

Core Graphics實(shí)現(xiàn)

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextSetRGBStrokeColor(currentContext, 1, 0, 0, 1);

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(currentContext, NULL, a.x, a.y);
CGPathAddLineToPoint(currentContext, NULL, b.x, b.y);
CGContextAddPath(currentContext, path);

CGContextStrokePath(currentContext);
CGPathRelease(path);

帶Ref后綴的C結(jié)構(gòu)是用來模擬面向?qū)ο髾C(jī)制的,算是一個(gè)“對(duì)象”,創(chuàng)建“對(duì)象”時(shí),也是返回一個(gè)指向?qū)ο髢?nèi)存地址的指針

使用Core Graphics繪制陰影和漸變

繪制陰影之前,需要將陰影效果添加到一個(gè)圖形上下文中,之后再改圖形上下文中繪制的所有不透明圖像都會(huì)帶有陰影效果

注意沒有刪除陰影效果的函數(shù),所以需要在添加陰影效果之前保存繪圖狀態(tài),之后再回復(fù)沒有陰影效果的狀態(tài)

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextSaveGState(currentContext);         // 保存繪圖狀態(tài)
CGContextSetShadow(currentContext, CGSizeMake(4, 7), 3);
// 在這里繪制的圖像會(huì)帶有陰影效果
// 繪制圖像
UIImage *logoImage = [UIImage imageNamed:@"logo"];
[logoImage drawInRect: rect];

CGContextRestoreGState(currentContext);    // 恢復(fù)之前的繪圖狀態(tài)
// 在這里繪制的圖像不帶陰影效果

漸變

CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextSaveGState(currentContext);         // 保存繪圖狀態(tài)

CGFloat locations[2] = {0.0, 1.0};
CGFloat components[8] = {1, 0, 0, 1,     // 起始顏色red
                         1, 1, 0, 1};       // 終止顏色yellow
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorspace, components, locations, 2);

CGPoint startPoint = CGPointMake(0, 0);
CGPoint endPoint = CGPointMake(0, 30);
CGContextDrawLinearGradient(currentContext, gradient, startPoint, endPoint, 0);

CGGradientRelease(gradient);
CGColorSpaceRelease(colorspace);

CGContextRestoreGState(currentContext);    // 恢復(fù)之前的繪圖狀態(tài)

CGContextDrawLinearGradient最后一個(gè)參數(shù)用來設(shè)置起始位置和終止位置以外的繪制區(qū)域的顏色填充方式。

  • kCGGradientDrawsBeforeStartLocation使用起始顏色填充起始位置之前的繪制區(qū)域
  • kCGGradientDrawsAfterEndLocation使用終止顏色填充終止位置之后的繪制區(qū)域
  • kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation起始和終止都要填充
  • 0都不填充
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容