您的位置:首页 > 移动开发 > IOS开发

iOS开发Quartz2D之八:图形上下文状态栈

2016-08-30 14:07 453 查看
#import "DrawView.h"

@implementation DrawView

- (void)drawRect:(CGRect)rect {
// Drawing code

//1.获取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.描述路径
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(20, 150)];
[path addLineToPoint:CGPointMake(280, 150)];

//3.把路径添加到上下文当中.
CGContextAddPath(ctx, path.CGPath);

//保存当前上下文的状态
CGContextSaveGState(ctx);

//设置上下文的状态
CGContextSetLineWidth(ctx, 10);
[[UIColor redColor] set];

CGContextSaveGState(ctx);

//4.把上下文当中的内容渲染View
CGContextStrokePath(ctx);

UIBezierPath *path2 = [UIBezierPath bezierPath];
[path2 moveToPoint:CGPointMake(150, 20)];
[path2 addLineToPoint:CGPointMake(150, 280)];
//把路径添加到上下文当中.
CGContextAddPath(ctx, path2.CGPath);

//    CGContextSetLineWidth(ctx, 1);
//    [[UIColor blackColor] set];
//从上下文状态栈当中恢复上下文的状态
CGContextRestoreGState(ctx);
CGContextRestoreGState(ctx);

//把上下文当中的内容渲染View
CGContextStrokePath(ctx);

}

@end


上下文状态栈为内存中的一块区域,它用来保存前上下文当的状态.

我们获取的图层上下文当中其实两块区域,一个是存放添加的路径,一个是用来保存用户设置的状态,

这些状态包括线条的颜色,线宽等.

当我们把上下文的内容渲染到View上面的时候,

它会自动将设置的所有上下文状态运行到保存的路径上面显示到View上面.

如果想要有多种状态,可以先把路径渲染到View上面,

再从新添加路径.添加完路径之后,重新设置上下文的状态.

再把新设置的上下文状态渲染到View上面.

我们可以利用上下文状态栈的方式,在设置状态之前,把之前的状态保存到上下文状态栈里面.

下一次想要再使用之前的状态时, 可以从上下文状态当中取出之前保存的上下文状态.上下文状态栈是先进后出的

1.如何把上下文状态保存到上下文状态栈?

CGContextSaveGState(ctx);

2.如何从上下文状态栈中取出上下文状态?

CGContextRestoreGState(ctx);



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: