CoreGraphics 之CGAffineTransform仿射变换(3)
CoreGraphics 之CGAffineTransform仿射变换(3)
CoreGraphics 的 仿射变换 可以用于 平移、旋转、缩放变换路径 或者图形上下文。
(1)平移变换将路径或图形上下文中的形状的当前位置平移到另一个相对位置。举例来说,如果你在(10,20)的位置处画一个点,对它应用(30,40)的平移变换,然后绘制它,这个点将被绘制在(40,60)的位置处。为了创建一个平移变换,使用CGAffineTransformMakeTranslation函数,它将返回一个CGAffineTransform类型的仿射变换,这个函数的两个参数指定x和y方向上以点为单位的平移量。我们还可以使用CGContextTranslateCTM过程对图形上下文应用变换。
平移变换路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
//平移变换 -( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); CGAffineTransform transform = CGAffineTransformMakeTranslation(100.0f, 0.0f); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGPathAddRect(path, &transform, rectangle); CGContextAddPath(currentContext, path); [[UIColor brownColor] setStroke]; [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); } |
平移变换图形上下文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); CGPathAddRect(path, NULL, rectangle); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextSaveGState(currentContext); CGContextTranslateCTM(currentContext, 100.0f, 40.0f); CGContextAddPath(currentContext, path); [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; [[UIColor brownColor] setStroke]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); CGContextRestoreGState(currentContext); } |
(2)缩放是另外一个你可以使用的变换。你可以很容易地让CoreGraphics 对形状进行缩放,例如一个圆形缩放到原来的100倍。要创建一个仿射缩放变换,使用CGAffineTransformMakeScale函数,它返回一个CGAffineTransform 类型的变换对象。如果你想直接对一个图形上下文使用缩放变换,使用CGContextScaleCTM过程来缩放当前变换矩阵。
缩放路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); CGAffineTransform transform = CGAffineTransformMakeScale(0.5f, 0.5f); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGPathAddRect(path, &transform, rectangle); CGContextAddPath(currentContext, path); [[UIColor brownColor] setStroke]; [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); } |
缩放图形上下文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); CGPathAddRect(path, NULL, rectangle); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextSaveGState(currentContext); CGContextScaleCTM(currentContext, 0.5f, 0.5f); CGContextAddPath(currentContext, path); [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; [[UIColor brownColor] setStroke]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); CGContextRestoreGState(currentContext); } |
(3)就像缩放和平移,你可以对绘制在路径上的形状和图形上下文应用旋转变换。你可以使用CGAffineTransformMakeRoation函数和一个旋转的弧度值来获取一个CGAffineTransform类型的变换.如果你想对整个图形上下文旋转指定角度,可以使用CGContextRotateCTM过程。
旋转路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); CGAffineTransform transform = CGAffineTransformMakeRotation((45.0f * M_PI) / 180.0f); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGPathAddRect(path, &transform, rectangle); CGContextAddPath(currentContext, path); [[UIColor brownColor] setStroke]; [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); } |
旋转图形上下文
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 300.0f); CGPathAddRect(path, NULL, rectangle); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextSaveGState(currentContext); CGContextRotateCTM(currentContext, (45.0f * M_PI) / 180.0f); CGContextAddPath(currentContext, path); [[UIColor colorWithRed:0.20f green:0.6f blue:0.8f alpha:1.0f] setFill]; [[UIColor brownColor] setStroke]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); CGContextRestoreGState(currentContext); } |
另外我们还可以组合变换效果,使用 CGAffineTransformConcact函数组合两个变换效果,这个函数的两个参数都是类型为CGAffineTransform类型的变换。
组合多个变换效果,同时进行平移和缩放
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-( void )drawRect:(CGRect)rect { CGMutablePathRef path = CGPathCreateMutable(); CGRect rectangle = CGRectMake(10.0f, 10.0f, 200.0f, 200.0f); CGAffineTransform transform1 = CGAffineTransformMakeTranslation(100.0f, 0.0f); CGAffineTransform transform2 = CGAffineTransformMakeScale(0.5f, 0.5f); CGAffineTransform transform = CGAffineTransformConcat(transform1, transform2); CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGPathAddRect(path, &transform, rectangle); CGContextAddPath(currentContext, path); [[UIColor brownColor] setStroke]; [[UIColor colorWithRed:0.20f green:0.60f blue:0.80f alpha:1.0f] setFill]; CGContextSetLineWidth(currentContext, 5.0f); CGContextDrawPath(currentContext, kCGPathFillStroke); CGPathRelease(path); }
|
CoreGraphics 之CGAffineTransform仿射变换(3)的更多相关文章
- [Xcode 实际操作]二、视图与手势-(9)CGAffineTransform仿射变换的使用
目录:[Swift]Xcode实际操作 本文将演示使用视图对象的仿射变换功能,旋转视图对象. import UIKit class ViewController: UIViewController { ...
- CGAffineTransform
这个是CoreGraphics框架中的CGAffineTransform类,可用于设定UIView的transform属性.控制视图的缩放.旋转和平移操作.另称仿射变换矩阵. Quartz转换实现原理 ...
- CGAffineTransform相关函数
CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2); [xxx setTransform ...
- IOSView翻转扭矩位移
CoreGraphics.h CGAffineTransform rotation = CGAffineTransformMakeRotation(M_PI_2);[xxx setTransform: ...
- iOS - 视图与手势(UIview & UIGestureRecognizer)
01 UIView视图的基本使用 --- 在根视图中添加2个UIView视图 //视图确实加载时调用 - (void)viewDidLoad { [super viewDidLoad]; // Do ...
- iOS开发--知识点总结
1 .全局变量,变量名前加下划线.和系统一致. 2 . nil指针为空 @“”字符串为空 (内容为空) == 判断内存地址 基本变量 对于一些基本类型 可以使用==来判断, ...
- iOS核心动画高级技巧之图层变换和专用图层(二)
iOS核心动画高级技巧之CALayer(一) iOS核心动画高级技巧之图层变换和专用图层(二)iOS核心动画高级技巧之核心动画(三)iOS核心动画高级技巧之性能(四)iOS核心动画高级技巧之动画总结( ...
- [Swift]Xcode实际操作
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- iOS下的2D仿射变换机制(CGAffineTransform相关)
仿射变换简介 仿射变换源于CoreGraphics框架,主要作用是绘制2D级别的图层,几乎所有iOS设备屏幕上的界面元素都是由CoreGraphics来负责绘制.而我们要了解的2D仿射变换是其下负责二 ...
随机推荐
- 人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五)
原文:人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五) 前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参 ...
- How to make vcredist_x86 reinstall only if not yet installed
Since you don't want to tell what minimal version of Visual C++ redistributable package you require, ...
- 在QLabel上点击获得的效果
一般说只在button中点击获得事件,作出相应的反应.而往往需要在QLabel上作出点击和触碰的效果. 我用qlabel做出了一个效果,当鼠标碰到label区域,label底下出现一条线,离开后线条消 ...
- Linux系统编程(27)——线程控制
进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,那么如何在一个进程的地址空间中执行多个线程呢.有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比 ...
- hdu&&poj搜索题题号
搜索 hdu1067 哈希 hdu1401 双向搜索 hdu1430 哈希 hdu1667 跌搜+启发式函数 hdu1685 启发式搜索 hdu1813 启发式搜索 hdu1885 状态压缩搜索 hd ...
- 【转】C++动态创建二维数组,二维数组指针
原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...
- React问答小demo
在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次 ...
- Eclipse设置保存时自动给变量加final
也是针对checkstyle的,在代码检查规范时,所有的变量必须是final.为了解决这个问题,通过以下的设置可以在eclipse保存时,自动给没有加final的变量加上final. Window-& ...
- lesson3:使用java代码的方式对不能识别的协议进行压力测试
在我们的实际环境中,我们所使用的协议肯定不只是http的方式,对于rpc等调用协议,目前jmeter没有相应的sampler支持,这时就需要通过引入我们自己写的jar包的方式来解决这个问题.例如:当我 ...
- Object-C 类定义 -- 笔记
OC类分为两个文件,一个是.h文件,一个是.m文件 .h文件 存放类,函数的申明 .文件 存放类的具体实现 类申明使用关键字 @interface @end来申明 类实现使用关键字@implement ...