使用UIView动画完成一个下雪动画

来源:互联网 发布:windows查看端口mac 编辑:程序博客网 时间:2024/05/16 07:44

使用UIView动画完成一个下雪动画

UIView动画是UIKit提供专门制作动画的API,其本质是对CoreAnimation的封装,使用UIView可以轻松方便的实现动画,不需要经过任何计算,本案例使用UIView制作一个下雪的动画,如图-2所示:

图-2

首先在创建好的Xcode项目中,将Storyboard中场景背景设置为黑色,在TRViewController类中定义一个NSInteger类型的私有属性count,由于给雪花计数。

其次在viewDidLoad方法中创建一个用于生成雪花的计时器,每隔1/30秒调用一次生成雪花的方法animate:。

然后实现animate:方法,在该方法中首先创建一个UIImageView类型的对象snow,将image属性设置为雪花图片,snow的大小随机生成。由于在其他方法中还会用到snow对象,所以将snow的tag值设置为属性count,每次调用animate:方法即每次生成一个snow对象,count都做自加操作,用于给雪花计数。

再在animate:方法中使用UIView的动画,给snow添加UIViewAnimationOptionCurveEaseIn类型的动画效果,使snow可以飞舞起来。

最后snow落到地面后,使用UIView的动画方法给snow对象添加融化消失的动画,并将snow对象从界面移除。

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

步骤一:创建添加雪花的计时器

首先在创建好的Xcode项目中,将Storyboard中场景背景设置为黑色,在TRViewController类中定义一个NSInteger类型的私有属性count,由于给雪花计数,代码如下所示:

  1. @interface TRViewController ()
  2. @property (nonatomic) NSInteger count;//计数雪片的数量
  3. @end

其次在viewDidLoad方法中创建一个用于生成雪花的计时器,每隔1/30秒调用一次生成雪花的方法animate:,代码如下所示:

  1. #define FPS 30.0
  2. - (void)viewDidLoad
  3. {
  4. [super viewDidLoad];
  5. //创建生成雪花的计时器
  6. [NSTimer scheduledTimerWithTimeInterval:1/FPS target:self selector:@selector(animate:) userInfo:nil repeats:YES];
  7. }

步骤二:使用UIView的动画方法给雪花添加动画

首先实现animate:方法,在该方法中首先创建一个UIImageView类型的对象snow,将image属性设置为雪花图片,snow的大小随机生成。由于在其他方法中还会用到snow对象,所以将snow的tag值设置为属性count,每次调用animate:方法即每次生成一个snow对象,count都做自加操作用于给雪花计数,代码如下所示:

  1. #define MAX_SIZE 10
  2. - (void)animate:(NSTimer *)timer
  3. {
  4. //创建一片雪花
  5. UIImageView *snow = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"snow.png"]];
  6. int viewWidth = self.view.bounds.size.width;
  7. //雪花的大小随机生成
  8. CGFloat size = arc4random() % MAX_SIZE + MAX_SIZE;
  9. snow.frame = CGRectMake(arc4random() % viewWidth, -20, size, size);
  10. [self.view addSubview:snow];
  11. self.count++;
  12. snow.tag = self.count;
  13. }

最后实现方法snowDisppearAnimate:,该方法中snow落到地面后,使用UIView的动画方法给snow对象添加融化消失的动画,并将snow对象从界面移除,代码如下所示:

  1. #define DISPPEAR_DURATION 2
  2. //雪花落地动画结束后调用的方法,化雪动画
  3. - (void)snowDisppearAnimate:(NSInteger)snowTag
  4. {
  5. UIImageView *snow = (UIImageView *)[self.view viewWithTag:snowTag];
  6. [UIView animateWithDuration:arc4random() % DISPPEAR_DURATION + 2 delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
  7. snow.alpha = 0.0;
  8. } completion:^(BOOL finished) {
  9. [self removeSnow:snowTag];
  10. }];
  11. }
  12. - (void)removeSnow:(NSInteger)snowTag
  13. {
  14. UIImageView *snow = (UIImageView *)[self.view viewWithTag:snowTag];
  15. [snow removeFromSuperview];
  16. }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新疆外地电信卡信号差怎么办 华为手机搜索不到wifi怎么办 华为浏览器恢复只有一个页面怎么办 华为手机触摸屏没反应怎么办 快递不给送上楼怎么办 华为荣耀手机声音小怎么办 华为手机来电铃声小怎么办 s弯出来时老压线怎么办 苹果7p手机弯了怎么办 小米手机摔弯了怎么办 华为畅享5没声音怎么办 掌阅语音闪退怎么办 华为mate开屏成排线怎么办 华为mate8电池坏了怎么办 8plus拍照不清晰怎么办 荣耀手环3丢了怎么办 华为mate9手机声音小怎么办 华为麦芒6丢了怎么办 华为麦芒4无法访问移动网络怎么办 自拍时屏幕是白的怎么办 华为麦芒5手机音量小怎么办 小米5x玩王者卡怎么办 小米5x打王者卡怎么办 华为荣耀10卡顿怎么办 麦芒6记不得密码怎么办 华为麦芒4镜头碎了怎么办 三星s5出像网的信号怎么办 华为手机进海水资料怎么办 华为手机进海水了怎么办 苹果手机玩王者荣耀卡怎么办 玩王者荣耀闪屏怎么办 王者荣耀太卡了怎么办 想卖王者号qq怎么办 小米4电视发热严重怎么办 三星玩王者荣耀卡怎么办 华为麦芒5网络差怎么办 华为麦芒无线信号不好怎么办 华为麦芒6网络不好怎么办 华为麦芒6信号差怎么办 华为手机无线网信号差怎么办 华为麦芒6数据信号差怎么办