Graphics Context是圖形上下文,也可以理解為一塊畫布,我們可以在上面進行繪畫操作,繪製完成後,將畫布放到我們的view中顯示即可,view看作是一個畫框.
CGContextRef功能強大,我們藉助它可以畫各種圖形。開發過程中靈活運用這些技巧,可以協助我們提供代碼水平。
首先建立一個整合自UIView的,自訂CustomView類。
在CustomView.m中實現代碼。
複製代碼 代碼如下:
#import <QuartzCore/QuartzCore.h>
覆蓋DranRect方法,在此方法中繪製圖形。
CustomView寫好之後,需要使用到視圖控制器中。
使用方法:
複製代碼 代碼如下:
CustomView *customView = [[CustomView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view addSubview:customView];
寫文字
複製代碼 代碼如下:
- (void)drawRect:(CGRect)rect
{
//獲得當前畫板
CGContextRef ctx = UIGraphicsGetCurrentContext();
//顏色
CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
//畫線的寬度
CGContextSetLineWidth(ctx, 0.25);
//開始寫字
[@"我是文字" drawInRect:CGRectMake(10, 10, 100, 30) withFont:font];
[super drawRect:rect];
}
這段代碼就可以很漂亮的寫出四個大字:我是文字。很容易理解,每句話都有注釋。
畫直線
複製代碼 代碼如下:
- (void)drawRect:(CGRect)rect
{
//獲得當前畫板
CGContextRef ctx = UIGraphicsGetCurrentContext();
//顏色
CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
//畫線的寬度
CGContextSetLineWidth(ctx, 0.25);
//頂部橫線
CGContextMoveToPoint(ctx, 0, 10);
CGContextAddLineToPoint(ctx, self.bounds.size.width, 10);
CGContextStrokePath(ctx);
[super drawRect:rect];
}
畫弧線
複製代碼 代碼如下:
CGContextSetRGBStrokeColor(context, 0, 0, 1, 1);//改變畫筆顏色
CGContextMoveToPoint(context, 140, 80);//開始座標p1
//CGContextAddArcToPoint(CGContextRef c, CGFloat x1, CGFloat y1,CGFloat x2, CGFloat y2, CGFloat radius)
//x1,y1跟p1形成一條線的座標p2,x2,y2結束座標跟p3形成一條線的p3,radius半徑,注意, 需要算好半徑的長度,
CGContextAddArcToPoint(context, 148, 68, 156, 80, 10);
CGContextStrokePath(context);//繪畫路徑
畫圓
複製代碼 代碼如下:
- (void)drawRect:(CGRect)rect
{
//獲得當前畫板
CGContextRef ctx = UIGraphicsGetCurrentContext();
//顏色
CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
//畫線的寬度
CGContextSetLineWidth(ctx, 0.25);
//void CGContextAddArc(CGContextRef c,CGFloat x, CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle, int clockwise)1弧度=180°/π (≈57.3°) 度=弧度×180°/π 360°=360×π/180 =2π 弧度
// x,y為圓點座標,radius半徑,startAngle為開始的弧度,endAngle為 結束的弧度,clockwise 0為順時針,1為逆時針。
CGContextAddArc(ctx, 100, 20, 20, 0, 2*M_PI, 0); //添加一個圓
CGContextDrawPath(ctx, kCGPathStroke); //繪製路徑
[super drawRect:rect];
}
這個畫圓的公式你還記得嗎?你還知道M_PI是什麼嗎?等於多少嗎?趕緊腦補一下吧!
畫大圓並填充顏色
複製代碼 代碼如下:
UIColor *aColor = [UIColor colorWithRed:1 green:0.0 blue:0 alpha:1];
CGContextSetFillColorWithColor(context, aColor.CGColor);//填充顏色
CGContextSetLineWidth(context, 3.0);//線的寬度
CGContextAddArc(context, 250, 40, 40, 0, 2 * M_PI, 0); //添加一個圓
//kCGPathFill填充非零繞數規則,kCGPathEOFill表示用奇偶規則,kCGPathStroke路徑,kCGPathFillStroke路徑填充,kCGPathEOFillStroke表示描線,不是填充
CGContextDrawPath(context, kCGPathFillStroke); //繪製路徑加填充
畫矩形
複製代碼 代碼如下:
- (void)drawRect:(CGRect)rect
{
//獲得當前畫板
CGContextRef ctx = UIGraphicsGetCurrentContext();
//顏色
CGContextSetRGBStrokeColor(ctx, 0.2, 0.2, 0.2, 1.0);
//畫線的寬度
CGContextSetLineWidth(ctx, 0.25);
CGContextAddRect(ctx, CGRectMake(2, 2, 30, 30));
CGContextStrokePath(ctx);
[super drawRect:rect];
}
畫扇形
複製代碼 代碼如下:
//畫扇形,也就畫圓,只不過是設定角度的大小,形成一個扇形
aColor = [UIColor colorWithRed:0 green:1 blue:1 alpha:1];
CGContextSetFillColorWithColor(context, aColor.CGColor);//填充顏色
//以10為半徑圍繞圓心畫指定角度扇形
CGContextMoveToPoint(context, 160, 180);
CGContextAddArc(context, 160, 180, 30, -60 * PI / 180, -120 * PI / 180, 1);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke); //繪製路徑
畫貝茲路徑
複製代碼 代碼如下:
//二次曲線
CGContextMoveToPoint(context, 120, 300);//設定Path的起點
CGContextAddQuadCurveToPoint(context,190, 310, 120, 390);//設定貝茲路徑的控制點座標和終點座標
CGContextStrokePath(context);
//三次曲線函數
CGContextMoveToPoint(context, 200, 300);//設定Path的起點
CGContextAddCurveToPoint(context,250, 280, 250, 400, 280, 300);//設定貝茲路徑的控制點座標和控制點座標終點座標
CGContextStrokePath(context);