Quartz 2D的坐标系和UIKit的坐标系对比以及相互转换 ? 赶驴记
来源:互联网 发布:关于网络暴力的数据 编辑:程序博客网 时间:2024/05/21 07:53
Quartz 2D和UIKit的坐标系是不同的,这个也就可以理解为什么用Quartz 2D画和UIKit的倒过来的。
先看看下图:
左边的坐标系是Quartz 2D的坐标系,原点在左下角。右边是UIKit的坐标系,原点在右上角。我们代码来直观说明一下两者的关系:
1、首先用常规的方式在屏幕上把icon图片打印出来。看看原始的icon图片是什么样子的。
UIImage *image =[UIImage imageNamed:@"icon@2x.png"]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10 , 57, 57)]; imageView.clipsToBounds = NO; [imageView setImage:image]; [self.view addSubview:imageView];
运行看结果,结果如下(完全意料之中的结果):
2、接下来,我们看看Quartz 2D的表现是什么样的。
UIImage *image =[UIImage imageNamed:@"icon@2x.png"]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10 , 57, 57)]; imageView.clipsToBounds = NO; [self.view addSubview:imageView]; UIGraphicsBeginImageContext(CGSizeMake(image.size.width, image.size.height));//新建一个Quartz Context CGContextRef context = UIGraphicsGetCurrentContext(); CGContextDrawImage(context,CGRectMake(0, 0, image.size.width, image.size.height) , [image CGImage]); //把图片打印在Quartz Context上面 UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();//从Quartz Context上面获取图片的结果 UIGraphicsEndImageContext(); [imageView setImage:resultImage];//把从Quartz Context上面获取到的图片显示到UIKit的Context里面来
结果如下图所示:
我们可以得出的结果就是,Quartz 2D和UIKit的坐标系是在Y轴方向的镜像关系的。
接下来,就是一个关键问题了,如何把Quartz 2D中画的图正常的显示到UIKit体系中呢?
答案就是对Quartz 2D的坐标系进行转换:
UIGraphicsBeginImageContext(CGSizeMake(image.size.width, image.size.height)); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextRotateCTM(context, M_PI); //先旋转180度,是按照原先顺时针方向旋转的。这个时候会发现位置偏移了 CGContextScaleCTM(context, -1, 1); //再水平旋转一下 CGContextTranslateCTM(context,0, -image.size.height);//再把偏移掉的位置调整回来 CGContextDrawImage(context,CGRectMake(0, 0, image.size.width, image.size.height) , [image CGImage]); UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();
先运行看看结果:
结果正常了,要理解上面代码的意图关键要理解这三句代码:
CGContextRotateCTM(context, M_PI); //先旋转180度,是按照原先顺时针方向旋转的。这个时候会发现位置偏移了 CGContextScaleCTM(context, -1, 1); //再水平旋转一下 CGContextTranslateCTM(context,0, -image.size.height);//再把偏移掉的位置调整回来
其中,旋转、翻转然后偏移。要理解这三句代码,关键要清楚CTM的含义:current transformation matrix(当前变换矩阵),一个矩阵用来变换context的坐标系的。关键是变换的context的坐标系,而不是context里面的内容。和UIView的transform是不一样的概念。
用下面的图片来说明这个变化过程:
通过这个几个步骤,把Quartz转成UIKit一致的坐标系了。
0 0
- Quartz 2D的坐标系和UIKit的坐标系对比以及相互转换 ? 赶驴记
- Quartz 2D的坐标系和UIKit的坐标系对比以及相互转换
- Quartz 2D的坐标系和UIKit的坐标系对比以及相互转换
- 眼坐标系和世界坐标系的相互转换
- UIView之drawRect:和Quartz 2D的坐标系问题
- cocos2d-js中的回调函数中世界坐标系和节点坐标系的相互转换
- ITRS/GCRS/J2000坐标系的相互转换
- 任意两不同坐标系的相互转换
- 3D坐标系:3D笛卡尔坐标系和3D柱面坐标系的区别
- iOS 【UIKit-转换坐标系(2)】
- 【笔记】世界坐标系和相机坐标系的转换
- Location定位信息以及坐标系的转换
- 坐标系的转换
- 平面的坐标系转换
- 坐标系的转换
- ios 坐标系的转换
- 坐标系的转换
- 转换控件的坐标系
- Android procrank && dumpsys meminfo使用详解
- 解决Cannot change version of project facet Dynamic Web M
- Java常见内存溢出(OOM)解决方案
- 二项队列
- iOS NSDate 转换成星期
- Quartz 2D的坐标系和UIKit的坐标系对比以及相互转换 ? 赶驴记
- 关于iOS自定义字体
- 【Android】状态栏通知Notification、NotificationManager详解
- 使用requirejs 调用百度地图解决方案
- Qt布局管理: 分割窗口QSplitter类讲解(纯代码实现分割窗口)
- hdu 1546 Idiomatic Phrases Game(最短路)
- 高效使用Bitmaps(二) 后台加载Bitmap
- leetcode 14:Longest Common Prefix
- poj1988 Cube Stacking(关系并查集)