码迷,mamicode.com
首页 > 其他好文 > 详细

08 - 图形上下文状态栈

时间:2015-12-09 23:17:23      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

 

08-图形上下文状态栈

上下文状态栈为内存中的一块区域,它用来保存前上下文当的状态.
我们获取的图层上下文当中其实两块区域,一个是存放添加的路径,一个是用来保存用户设置的状态,
这些状态包括线条的颜色,线宽等.
当我们把上下文的内容渲染到View上面的时候, 
它会自动将设置的所有上下文状态运行到保存的路径上面显示到View上面.

如果想要有多种状态,可以先把路径渲染到View上面,
再从新添加路径.添加完路径之后,重新设置上下文的状态.
再把新设置的上下文状态渲染到View上面.

我们可以利用上下文状态栈的方式,在设置状态之前,把之前的状态保存到上下文状态栈里面.
下一次想要再使用之前的状态时, 可以从上下文状态当中取出之前保存的上下文状态.

1.如何把上下文状态保存到上下文状态栈?
   CGContextSaveGState(ctx);
2.如何从上下文状态栈中取出上下文状态?
   CGContextRestoreGState(ctx);

代码实现:


#import "ZYQView.h"

@implementation ZYQView


- (void)drawRect:(CGRect)rect {
    // 第一条线
    //获取上下文
    CGContextRef ctr = UIGraphicsGetCurrentContext();
    //获取路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(40, 100)];
    [path addLineToPoint:CGPointMake(180, 100)];
    //保存当前上下文的状态设置
    CGContextSaveGState(ctr);
    //设置上下文的状态
    CGContextSetLineWidth(ctr, 10);
    [[UIColor blueColor] set];
    //将路径添加到上下文中
    CGContextAddPath(ctr, path.CGPath);
    //渲染上下文
    CGContextStrokePath(ctr);
    
    //第二条线
    path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(110, 50)];
    [path addLineToPoint:CGPointMake(110, 150)];
    
    //从上下文状态栈当中取出保存状态
    CGContextRestoreGState(ctr);
    //将路径添加到上下文中
    CGContextAddPath(ctr, path.CGPath);
    //渲染上下文
    CGContextStrokePath(ctr);    
}
@end

实现效果:

技术分享

上下文的矩阵操作

 上下文的矩阵操作其实就是修改上下文的形变,
  主要有以下几种
  平移
  CGContextTranslateCTM(ctx, 100, 100);
  旋转
  CGContextRotateCTM(ctx, M_2_PI);
  缩放
  CGContextScaleCTM(ctx, 0.5, 0.5);
  注意:上下文操作必须得要在添加路径之前去设置

08 - 图形上下文状态栈

标签:

原文地址:http://www.cnblogs.com/zhoudaquan/p/5034477.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!