旋轉(zhuǎn)和縮放的同時(shí)進(jìn)行
簡(jiǎn)單需求描述:點(diǎn)擊圖層右下角可以進(jìn)行縮放和旋轉(zhuǎn),點(diǎn)擊中間區(qū)域可以進(jìn)行移動(dòng),可能點(diǎn)擊其他三個(gè)角進(jìn)行其他操作。
思路方案
方案一(不可?。?/h4>
通過(guò)touch事件計(jì)算移動(dòng)的距離,然后和最初的圖層寬高做對(duì)比,直接對(duì)圖層的size進(jìn)行等比例變化,保持中心點(diǎn)位置不變,然后再通過(guò)CGAffineTransformRotate進(jìn)行旋轉(zhuǎn)操作。
最后經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn)這種方式不可取,因?yàn)閷?duì)其放大之后,再對(duì)其進(jìn)行旋轉(zhuǎn)操作時(shí),圖層的大小會(huì)更改,不是我們要的等比例的。
方案二(不可取)
直接對(duì)最底層的圖層進(jìn)行縮放和旋轉(zhuǎn),這樣就會(huì)出現(xiàn)這個(gè)圖層上的所有子view都會(huì)進(jìn)行縮放和旋轉(zhuǎn),這就和我們的需求不一致了,所以也不可取。
方案二(可取)
不能像方案一一樣通過(guò)更改size的大小來(lái)實(shí)現(xiàn)縮放,我們直接使用CGAffineTransformScale進(jìn)行縮放,然后再通過(guò)CGAffineTransformRotate計(jì)算旋轉(zhuǎn)
旋轉(zhuǎn)角度的計(jì)算
通過(guò)三角函數(shù)atan2f來(lái)計(jì)算兩點(diǎn)角度所形成的弧度值。
如touch點(diǎn)為point,圖層的中心點(diǎn)為centPoint,那計(jì)算的弧度值如下:
CGFloat currentRotation = atan2f((point.y - centerPoint.y), (point.x - centerPoint.x));
旋轉(zhuǎn)之后怎么計(jì)算其他三個(gè)角圖層的位置?
使用下面的CGPointApplyAffineTransform方法,得到某個(gè)點(diǎn)變換后的值。
CGAffineTransform相關(guān)的方法
1 CGAffineTransformScale(CGAffineTransform t,
CGFloat sx, CGFloat sy) 相對(duì)于上一次的縮放
第一個(gè)參數(shù):變換的對(duì)象
第二個(gè)參數(shù):寬的縮放值
第三個(gè)參數(shù):高方向的縮放值
2,CGAffineTransformMakeScale (CGFloat sx, CGFloat sy) 相對(duì)于最開(kāi)始時(shí)的縮放
參數(shù)說(shuō)明同上
CGAffineTransformMakeScale(-1.0, 1.0);//水平翻轉(zhuǎn)
CGAffineTransformMakeScale(1.0,-1.0);//垂直翻轉(zhuǎn)
3,CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle) 相對(duì)于上一次的旋轉(zhuǎn)
4,CGAffineTransformTranslate(CGAffineTransform t,
CGFloat tx, CGFloat ty) 相對(duì)于上次的平移
5,CGAffineTransformInvert(CGAffineTransform t) 返回Transformation的反向
6,CGAffineTransformConcat(CGAffineTransform t1,
CGAffineTransform t2) 合并兩個(gè)Transformation
返回一個(gè)由 t1 和 t2 合并而成的Transformation
7,bool CGAffineTransformEqualToTransform(CGAffineTransform t1,
CGAffineTransform t2) 返回一個(gè)bool值,用于判斷t1和t2是否一樣
8,CGPoint CGPointApplyAffineTransform(CGPoint point,
CGAffineTransform t) 某個(gè)點(diǎn)相對(duì)于t 變換后的點(diǎn),返回point點(diǎn)
9, CGSize CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t) size相對(duì)于t變換后的大小,返回size
10,CGRect CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t) rect相對(duì)于t變換后的大小,返回rect