bounds和frame
bounds表示的矩形位于自己的坐標(biāo)系,frame表示的矩形位于父視圖的坐標(biāo)系,但是兩個(gè)矩形的大小是相同的。(bounds.origin.x和bounds.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都不填充