CGAffineTransform旋转/缩放/平移 相关

旋转和缩放的同时进行

简单需求描述:点击图层右下角可以进行缩放和旋转,点击中间区域可以进行移动,可能点击其他三个角进行其他操作。

思路方案

方案一(不可取)

通过touch事件计算移动的距离,然后和最初的图层宽高做对比,直接对图层的size进行等比例变化,保持中心点位置不变,然后再通过CGAffineTransformRotate进行旋转操作。
最后经过实验发现这种方式不可取,因为对其放大之后,再对其进行旋转操作时,图层的大小会更改,不是我们要的等比例的。

方案二(不可取)

直接对最底层的图层进行缩放和旋转,这样就会出现这个图层上的所有子view都会进行缩放和旋转,这就和我们的需求不一致了,所以也不可取。

方案二(可取)

不能像方案一一样通过更改size的大小来实现缩放,我们直接使用CGAffineTransformScale进行缩放,然后再通过CGAffineTransformRotate计算旋转

旋转角度的计算

通过三角函数atan2f来计算两点角度所形成的弧度值。
如touch点为point,图层的中心点为centPoint,那计算的弧度值如下:

CGFloat currentRotation = atan2f((point.y - centerPoint.y), (point.x - centerPoint.x));

旋转之后怎么计算其他三个角图层的位置?
使用下面的CGPointApplyAffineTransform方法,得到某个点变换后的值。

CGAffineTransform相关的方法

1 CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) 相对于上一次的缩放

第一个参数:变换的对象
第二个参数:宽的缩放值
第三个参数:高方向的缩放值

2,CGAffineTransformMakeScale (CGFloat sx, CGFloat sy) 相对于最开始时的缩放
参数说明同上

CGAffineTransformMakeScale(-1.0, 1.0);//水平翻转

CGAffineTransformMakeScale(1.0,-1.0);//垂直翻转

3,CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) 相对于上一次的旋转

4,CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) 相对于上次的平移

5,CGAffineTransformInvert(CGAffineTransform t) 返回Transformation的反向

6,CGAffineTransformConcat(CGAffineTransform t1,
CGAffineTransform t2) 合并两个Transformation

返回一个由 t1 和 t2 合并而成的Transformation

7,bool CGAffineTransformEqualToTransform(CGAffineTransform t1,
CGAffineTransform t2) 返回一个bool值,用于判断t1和t2是否一样

8,CGPoint CGPointApplyAffineTransform(CGPoint point,
CGAffineTransform t) 某个点相对于t 变换后的点,返回point点

9, CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t) size相对于t变换后的大小,返回size

10,CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t) rect相对于t变换后的大小,返回rect

你可能感兴趣的:(CGAffineTransform旋转/缩放/平移 相关)