效果圖:
主要代碼
// DrawView.h
#import <UIKit/UIKit.h>
@interface DrawView : UIView
@end
// DrawView.m
#import "DrawView.h"
@implementation DrawView
/*
默認會開啟一個上下文,在這個上下文里面舌镶,有2個區(qū)域檬某,一個是存放路徑的區(qū)域豺裆,一個是存放
上下文狀態(tài)的區(qū)域,
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(20, 150)];
[path addLineToPoint:CGPointMake(280, 150)];
這三行代碼的作用是描述了一個路徑,
CGContextSaveGState(ctx);
這一行代碼的作用是保存當前的上下文的狀態(tài),一開始沒有修改上下文的狀態(tài),所以保存的是系統(tǒng)
默認的上下文的狀態(tài)醇王。做的操作是會把存放上下文狀態(tài)的區(qū)域里面當前的上下文狀態(tài)復(fù)制一份放到
上下文棧里面進行保存
[[UIColor redColor] set];
CGContextSetLineWidth(ctx, 10);
下面二行代碼的作用:修改存放上下文狀態(tài)的區(qū)域里面的當前上下文狀態(tài),不影響已經(jīng)放到上下文
棧里面的上下文狀態(tài)
CGContextAddPath(ctx, path.CGPath);
這行代碼的作用:把描述好的路徑添加到上下文里面的路徑區(qū)域中去
CGContextStrokePath(ctx);
這行代碼的作用:把上下文里面的路徑區(qū)域中的路徑渲染到view中去
這個時候崭添,紅色的水平線已經(jīng)畫好了寓娩。
UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointMake(150, 20)];
[path2 addLineToPoint:CGPointMake(150, 280)];
這三行代碼的作用是描述了一個路徑,
CGContextRestoreGState(ctx);
這行代碼的作用:從上下文狀態(tài)棧當中恢復(fù)狀態(tài)呼渣,即從上下文狀態(tài)棧中取出棧頂?shù)纳舷挛臓顟B(tài)棘伴,然后
放到上下文里面的存放上下文狀態(tài)的區(qū)域中去,作為當前的上下文狀態(tài)
CGContextAddPath(ctx, path2.CGPath);
這行代碼的作用:把描述好的路徑添加到上下文里面的路徑區(qū)域中去
CGContextStrokePath(ctx);
這行代碼的作用:把上下文里面的路徑區(qū)域中的路徑渲染到view中去
這個時候屁置,黑色的垂直線已經(jīng)畫好了排嫌。
*/
- (void)drawRect:(CGRect)rect {
//1.獲取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路徑
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(20, 150)];
[path addLineToPoint:CGPointMake(280, 150)];
// 保存上下文的狀態(tài),這個時候的上下文狀態(tài)會復(fù)制一份放到上下文棧里面進行保存
CGContextSaveGState(ctx);
// 下面兩行代碼不影響已經(jīng)放到上下文棧里面的上下文狀態(tài)
// 修改上下文的狀態(tài)
[[UIColor redColor] set];
CGContextSetLineWidth(ctx, 10);
//3.把路徑 添加到上下文當中
CGContextAddPath(ctx, path.CGPath);
//4.把上下文內(nèi)容渲染到View
CGContextStrokePath(ctx);
UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointMake(150, 20)];
[path2 addLineToPoint:CGPointMake(150, 280)];
// 從上下文狀態(tài)棧當中恢復(fù)狀態(tài)
// 下面這行代碼缰犁,相當于下面2行代碼
CGContextRestoreGState(ctx);
// [[UIColor blackColor] set];
// CGContextSetLineWidth(ctx, 1);
//3.把路徑 添加到上下文當中
CGContextAddPath(ctx, path2.CGPath);
//4.把上下文內(nèi)容渲染到View
CGContextStrokePath(ctx);
}
@end
主要原理圖:
圖1
圖2