在新建集成UIView的自定义的view中,- (void)drawRect:(CGRect)rect;方法中通过UIGraphicsGetCurrentContext()即可得到当前上下文
-
在congtroller中是不能直接用这种方法获取上下文的,因为congtroller中是没有上下文的,需要自己手动开启
关于坐标系:
1,UIKit坐标系原点是位于屏幕左上角
2,Quart 2D坐标系原点位于屏幕左下角,QuartzCore是基于Quart 2D,所以其坐标系也是位于左下角,不同于UIKit坐标系
3,但是我们在用UIGraphicsGetCurrentContext()的时候,UIkit对于QuarzCore的坐标系已经做了调整,所以我们不再需要重新翻转坐标系
如何证明:
- 下面我用Quarz2D新建一个上下文然后绘制图形上去,得到的结果如下图:
UIImage *image01 = [UIImage imageNamed:@"zhang.png"];
//之后我们用原生的坐标系进行绘图看一下效果
//1,新建图形上下文
UIGraphicsBeginImageContext(image01.size);
//2,获取当前图形上下文,并把图片打印在上下文中
CGContextRef context = UIGraphicsGetCurrentContext();
//注意:drawInRect:是UIKit框架封装的方法,所以这个里面既不需要上下文,也不需要倒转坐标系
//[image01 drawInRect:CGRectMake(0, 0, image01.size.width, image01.size.height)];
/*
//如果用原生方法,坐标系是按照Quarz 2D方式进行的,所以需要转换坐标系
CGContextRotateCTM(context, M_PI);//顺时针旋转180度
CGContextScaleCTM(context, -1, 1);//然后左右对调(也就是向右翻转)
CGContextTranslateCTM(context, 0, -image01.size.height);//然后把旋转时候高度损失补回来
*/
//如果关闭上述坐标系转换的代码,得到的图像是反转的,如下面的那张图
CGContextDrawImage(context, CGRectMake(0, 0, image01.size.width, image01.size.height), image01.CGImage);
//3,从上下文中获取图片,并结束上下文
UIImage *image02 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *imageData = UIImageJPEGRepresentation(image02, 1);
[imageData writeToFile:@"/users/feng/desktop/zhang.jpg" atomically:YES];
//4,把图片显示出来
UIImageView *imageView01 = [[UIImageView alloc] init];
imageView01.frame = CGRectMake(150, 100, 100, 100);
imageView01.backgroundColor = [UIColor redColor];
[self.view addSubview:imageView01];
imageView01.image = image02;
- 然后我们把上述的坐标系转换的代码解开注释,如下:
//如果用原生方法,坐标系是按照Quarz 2D方式进行的,所以需要转换坐标系
CGContextRotateCTM(context, M_PI);//顺时针旋转180度
CGContextScaleCTM(context, -1, 1);//然后左右对调(也就是向右翻转)
CGContextTranslateCTM(context, 0, -image01.size.height);//然后把旋转时候高度损失补回来
然后就可以得到正确的图形,如下: