旋轉和縮放的同時進行
簡單需求描述:點擊圖層右下角可以進行縮放和旋轉巫橄,點擊中間區(qū)域可以進行移動,可能點擊其他三個角進行其他操作纺棺。
思路方案
方案一(不可冗逗蕖)
通過touch事件計算移動的距離,然后和最初的圖層寬高做對比搭盾,直接對圖層的size進行等比例變化咳秉,保持中心點位置不變,然后再通過CGAffineTransformRotate進行旋轉操作鸯隅。
最后經(jīng)過實驗發(fā)現(xiàn)這種方式不可取澜建,因為對其放大之后,再對其進行旋轉操作時蝌以,圖層的大小會更改炕舵,不是我們要的等比例的。
方案二(不可雀)
直接對最底層的圖層進行縮放和旋轉咽筋,這樣就會出現(xiàn)這個圖層上的所有子view都會進行縮放和旋轉,這就和我們的需求不一致了徊件,所以也不可取奸攻。
方案二(可取)
不能像方案一一樣通過更改size的大小來實現(xiàn)縮放庇忌,我們直接使用CGAffineTransformScale進行縮放舞箍,然后再通過CGAffineTransformRotate計算旋轉
旋轉角度的計算
通過三角函數(shù)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) 相對于上一次的縮放
第一個參數(shù):變換的對象
第二個參數(shù):寬的縮放值
第三個參數(shù):高方向的縮放值
2晃酒,CGAffineTransformMakeScale (CGFloat sx, CGFloat sy) 相對于最開始時的縮放
參數(shù)說明同上
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