效果是图片有一个点固定, 然后拖拽view 使view按照指定的点旋转
我是获取触摸点和锚点的角度来旋转的, 不知道有没有什么更好的方法, 我就想出这么个, 忘请高手指点.
demo地址:https://github.com/Ra2212/RotateTheView.git
因为我们项目是要求底部中点,我就按照底部中点来的, 其他可以相应修改,
思想是划走上面的,然后alpha = 0; 返回到红色的下面alpha = 1;
可以左右划
//复原代码
CGAffineTransform transform = CGAffineTransformMakeRotation(0);
self.transform = transform;
self.began_X = 0;self.alpha = 1.0;
view的锚点设置, 先设置锚点, 在设置frame 不然frame会变, 至于frame 和 anchorPoint的关系自己百度吧;
//设置锚点
self.layer.anchorPoint = CGPointMake(0.5, 1);
self.frame = CGRectMake(got_p6(43), got_p6(17+64), ScreenWidth - got_p6(86), EVE_H);
给view添加拖拽手势
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
[self addGestureRecognizer:panGestureRecognizer];
在handlePan:方法中实现
//获取拖拽得到的角度
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是累加的, 就是实际偏移的
为啥用反正切函数,我解释下:
看图中角A 正好是tan A = _began_X / 高
高实际是手指按压点到锚点的垂直距离 实际体验旋转很快, 就放大到视图的高度也就是蓝色view 的高度, 然后反正切求出角A,
求的得A是弧度, 旋转正好也是弧度, 就直接旋转view
//旋转view
CGAffineTransform transform = CGAffineTransformMakeRotation(_began_X); self.transform = transform;
我又加了一些处理封装了一下, 比较low, 模拟器上拽几下没反应了, 真机效果很不错, 不知道什么鬼.
有什么宝贵意见尽请提哈, 互相学习!!!
附上demo地址:https://github.com/Ra2212/RotateTheView.git