效果是圖片有一個(gè)點(diǎn)固定, 然后拖拽view 使view按照指定的點(diǎn)旋轉(zhuǎn)
? ? 我是獲取觸摸點(diǎn)和錨點(diǎn)的角度來旋轉(zhuǎn)的, 不知道有沒有什么更好的方法, 我就想出這么個(gè), 忘請(qǐng)高手指點(diǎn).
demo地址:https://github.com/Ra2212/RotateTheView.git
因?yàn)槲覀冺?xiàng)目是要求底部中點(diǎn),我就按照底部中點(diǎn)來的, 其他可以相應(yīng)修改,
思想是劃走上面的,然后alpha = 0; 返回到紅色的下面alpha = 1;
可以左右劃
//復(fù)原代碼
CGAffineTransform transform = CGAffineTransformMakeRotation(0);
self.transform = transform;
self.began_X = 0;self.alpha = 1.0;
view的錨點(diǎn)設(shè)置,?先設(shè)置錨點(diǎn), 在設(shè)置frame 不然frame會(huì)變, 至于frame 和 anchorPoint的關(guān)系自己百度吧;
//設(shè)置錨點(diǎn)
self.layer.anchorPoint = CGPointMake(0.5, 1);
self.frame = CGRectMake(got_p6(43), got_p6(17+64), ScreenWidth - got_p6(86), EVE_H);
給view添加拖拽手勢(shì)
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self addGestureRecognizer:panGestureRecognizer];
在handlePan:方法中實(shí)現(xiàn)
//獲取拖拽得到的角度
UIView *vv = (UIView *)self.nextResponder;
CGPoint translation = [recognizer translationInView:vv];
double ang = atan((translation.x)/EVE_H);
_began_X = _began_X + ang;
ang是每次偏移的角度 , _began_X是累加的, 就是實(shí)際偏移的
為啥用反正切函數(shù),我解釋下:
看圖中角A 正好是tan A = _began_X / 高
高實(shí)際是手指按壓點(diǎn)到錨點(diǎn)的垂直距離? 實(shí)際體驗(yàn)旋轉(zhuǎn)很快, 就放大到視圖的高度也就是藍(lán)色view 的高度, 然后反正切求出角A,
求的得A是弧度, 旋轉(zhuǎn)正好也是弧度, 就直接旋轉(zhuǎn)view
//旋轉(zhuǎn)view
CGAffineTransform transform = CGAffineTransformMakeRotation(_began_X); self.transform = transform;
我又加了一些處理封裝了一下, 比較low, 模擬器上拽幾下沒反應(yīng)了, 真機(jī)效果很不錯(cuò), 不知道什么鬼.
有什么寶貴意見盡請(qǐng)?zhí)峁? 互相學(xué)習(xí)!!!
附上demo地址:https://github.com/Ra2212/RotateTheView.git