为了使程序看起来很简单很简单,我使用的并不是最合适的方法。
新建一个ios Application项目,选择Single View Application随便给项目起个名字。
自己写一个view让它具备拖拽转动的功能:
添加一个类TurntableView继承自UIView。拖拽转动的基本思路,用户手指按住屏幕并滑动时,程序可以得到滑动过程中的点,通过这些点与view的center可以得到滑动的角度,然后让view 的layer转动响应的角度即可
具体实现办法:
在自己定义的这个view类里重载touchesMoved方法,注意,要先再项目里面引用QuartzCore.framework,然后在该类的头文件里引用
#import <QuartzCore/QuartzCore.h>
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch * touch=[touches anyObject];
//在旋转的过程中self的坐标系会转动,到superview里面去找坐标点
CGPoint prePoint=[touch previousLocationInView:self.superview];//获取滑动过程中的前一个点
CGPoint curPoint=[touch locationInView:self.superview];//获取活动过程中的当前点
//计算这两个点与圆心连线构成的夹角
float angle=[selfgetAngleWithOrginPoint:self.centerPointX:prePoint PointY:curPoint];
//获取当前view的layer的transform属性
CATransform3D transform=self.layer.transform;
if (prePoint.y<self.center.y) {
//在当前transform的基础上,旋转一定的角度
transform=CATransform3DRotate(transform, angle,0, 0, 1);
}else
{
transform=CATransform3DRotate(transform, angle,0, 0, -1);
}
//将旋转角度后的transform赋给self.layer,这样就能让self.layer.transform跟着手指的滑动而变化,
实现转动的效果
self.layer.transform=transform;
}
//下面是计算两点与圆心连线构成夹角的方法,使用反正切的方法求角计算量要小一些,但是反正切函数是不连续的,需要自己做判断,这里留给读者自己去决定
//用反余弦函数求角
-(float)getAngleWithOrginPoint:(CGPoint)aOrginPoint PointX:(CGPoint)aPointX PointY:(CGPoint)aPointY
{
//得到pointX到原点的距离
float xToOrgin=[selfgetDistanceFromPointX:aPointX toPointY:aOrginPoint];
//得到pointX到原点的水平距离
float xDistanceOnX=aPointX.x-aOrginPoint.x;
//用反余弦函数得到pointX与水平线的夹角
float xAngle=acos(xDistanceOnX/xToOrgin);
//用同样的方法得到pointY与水平线的夹角
float yToOrgin=[selfgetDistanceFromPointX:aPointY toPointY:aOrginPoint];
float yDistanceOnX=aPointY.x-aOrginPoint.x;
float yAngle=acos(yDistanceOnX/yToOrgin);
float angle=xAngle-yAngle;
return angle;
}
//求两个点之间的距离
-(float)getDistanceFromPointX:(CGPoint)PointX toPointY:(CGPoint)PointY
{
float xDis=PointX.x-PointY.x;
float yDis=PointX.y-PointY.y;
float distance=sqrtf(xDis*xDis+yDis*yDis);
return distance;
}
完成后来看效果:在ViewController里引用这个类
#import "TurntableView.h"
在viewDidLoad里加上如下代码
- (void)viewDidLoad
{
[superviewDidLoad];
TurntableView * turntableView=[[TurntableViewalloc]initWithFrame:CGRectMake(0,0,200,200)];
turntableView.center=self.view.center;
turntableView.backgroundColor=[UIColorredColor];
[self.viewaddSubview:turntableView];
[turntableViewrelease];
}
点击运行,可以看到一个红色的方块,按住鼠标去拖,红色方块会跟着转动。这个效果也许不是很好,我们可以随意添加图片到turntableView上面,这样看起来效果会跟好一些,
这里使用了那个星座大师的素材,看起来还不错
当然这个TurntalbeView已经实现了最基本的拖拽转动的功能了,我们可以写一些类继承自它,从而扩展出我们想要的功能
这里是源码的下载地址
http://download.youkuaiyun.com/detail/a690993211/5019668