使用CoreAnimation实现最简单的拖拽转盘效果

为了使程序看起来很简单很简单,我使用的并不是最合适的方法。

新建一个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.csdn.net/detail/a690993211/5019668

      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值