旋转和缩放的同时进行
简单需求描述:点击图层右下角可以进行缩放和旋转,点击中间区域可以进行移动,可能点击其他三个角进行其他操作。
思路方案
方案一(不可取)
通过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