使用NSTimer做匀速动画和变速动画

14 篇文章 0 订阅

使用NSTimer做匀速动画和变速动画

NSTimer是一个计时器类,用于定时向指定对象发送消息,本案例使用NSTimer制作飞机匀速飞行和减速飞行的效果,如图-1所示:

图-1

首先在创建好的Xcode项目的Storyboard中拖放一个ImageView控件和Button控件,在右边栏的检查器中设置ImageView的显示图片,并将ImageView设置为TRViewController的属性imageView,将Button关联成TRViewController的方法start。

其次TRViewController中定义两个属性CGPoint类型的startPoint,用于记录飞机的开始点,NSUInteger类型的count用于计数。

然后实现start方法,在该方法创建一个计时器,每隔1/30秒重复调用方法run:。

最后实现方法run:,在该方法根据startPoint、count的计数、动画时长和帧率计算出每次调用该方法飞机移动的距离,如果是匀速运动每次移动的距离是相同的,如果是减速运动每次移动的距离则逐步减小。

实现此案例需要按照如下步骤进行。

步骤一:搭建StoryBoard界面

首先在创建好的Xcode项目的Storyboard中拖放一个ImageView控件和Button控件,在右边栏的检查器中设置ImageView的显示图片,并将ImageView设置为TRViewController的属性imageView,将Button关联成TRViewController的方法start,代码如下所示:


    
    
  1. @interface TRViewController ()
  2. @property (weak, nonatomic) IBOutlet UIImageView *imageView;
  3. @end

步骤二:创建计时器

首先在TRViewController中定义两个属性CGPoint类型的startPoint,用于记录飞机的开始点,NSUInteger类型的count用于计数,代码如下所示:


    
    
  1. @interface TRViewController ()
  2. @property (weak, nonatomic) IBOutlet UIImageView *aircraftView;
  3. @property (nonatomic) CGPoint startPoint;
  4. @property (nonatomic) NSUInteger count;
  5. @end

然后实现start方法,在该方法创建一个计时器,每隔1/30秒重复调用方法run:,代码如下所示:


    
    
  1. - (IBAction)start
  2. {
  3. self.startPoint = self.aircraftView.center;//记录开始位置
  4.     [NSTimer scheduledTimerWithTimeInterval:1/FPS target:self selector:@selector(run:) userInfo:nil repeats:YES];
  5. }

步骤三:实现run:方法

首先定义两个宏FPS用来表示帧率,DURATION用来表示动画时长,根据count的计数、动画时长和帧率计算出每次调用该方法飞机移动的距离,如果是匀速运动每次移动的距离是相同的,代码如下所示:


    
    
  1. #define FPS 30.0 //帧率
  2. #define DURATION 3//动画时长
  3. - (void)run:(NSTimer *)timer
  4. {
  5. self.count++;
  6. CGPoint center = self.aircraftView.center;
  7. center.y = self.startPoint.y + self.count * (80 - self.startPoint.y) / (FPS * DURATION);
  8. self.aircraftView.center = center;
  9. if(self.count >= FPS * DURATION) [timer invalidate];
  10. }

如果是减速运动每次移动的距离则逐步减小,代码如下所示:


    
    
  1. - (void) run:(NSTimer *)timer
  2. {
  3. CGPoint center = self.aircraft.center;
  4. //当前值=上一次的值+(目标值-上一次值)*渐近因子
  5. center.y = center.y + (100-center.y)*0.1;
  6. self.aircraft.center = center;
  7. if (center.y - 100 <= 1E-6) {
  8. [timer invalidate];
  9. }
  10. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值