博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用定时器制作雪花动画
阅读量:5141 次
发布时间:2019-06-13

本文共 2614 字,大约阅读时间需要 8 分钟。

1 #import "HUAppDelegate.h" 2  3 @implementation HUAppDelegate 4  5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 6 { 7     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 8     // Override point for customization after application launch. 9     self.window.backgroundColor = [UIColor colorWithRed:0 green:0.7 blue:1 alpha:0.7];10     [self.window makeKeyAndVisible];11     12     13     //创建数组,盛放雪花14     _snowArray = [[NSMutableArray alloc] init];15     for (int i=0; i < 30; i++)16     {17         UIImageView *snow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"flake.png"]];18         snow.frame = CGRectMake(arc4random() % 320, -20, 20, 20);19         [_snowArray addObject:snow];20         [self.window addSubview:snow];21         22     }23     //这个定时器使用来寻找可以进行下落的雪花24     [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(findSnow) userInfo:nil repeats:YES];25 26     //这个定时器是将找到的雪花下落27     [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(snowDown) userInfo:nil repeats:YES];28     29     return YES;30 }31 32 - (void)findSnow33 {34     for (int i = 0; i < _snowArray.count; i++)35     {36         UIImageView *imageView = [_snowArray objectAtIndex:i];37         if (imageView.tag == 0)  //使用 tag 值来标识雪花是否可以进行下落,0 表示可以,1表示不可以38         {39             imageView.tag = 1;  //tag 为 1 表示希望雪花进行下落40             break;41         }42     }43 }44 - (void)snowDown45 {46     for (int i = 0; i < _snowArray.count; i ++)47     {48         UIImageView *imageView = [_snowArray objectAtIndex:i];49         if (imageView.tag == 1)   //tag 为1表示这多雪花需要进行下落的动作50         {51             CGRect rect = imageView.frame;52             rect.origin.y += 1;  //通过改变纵坐标的值模拟动画,注意 OC 不允许深度赋值53             imageView.frame = rect;54             if (rect.origin.y > 480)55             {56                 rect.origin.x = arc4random() % 320;57                 rect.origin.y = -20;  //让已经下落到底部的雪花回到顶部,重新下落58                 imageView.frame = rect;59                 [_snowArray replaceObjectAtIndex:i withObject:imageView]; //这里是让已经下落到底部的雪花在重新利用,即循环下落,造成雪花无穷无尽的效果,尽管数组里只存储了 30 多雪花.观察这里发现,寻找雪花的定时器在进行了 30 次查找后发现,已经在也找不到一朵 tag 值为 0 的雪花了,此时最好是将这个定时器给销毁,否则它会一直重复寻找下去,消耗内存资源。另外一种方法是将已经下落到底部的雪花的 tag 值在重置为 0,但这种解法显然是没有前一种好的。60             }61         }62     }63 }64 65 @end

这种方法的好处是雪花的个数是可以控制的,并且通过方法达到无穷无尽(即重用)的效果,不需要像 UIView 动画那样没次都需要创建一个雪花的 UIImageView 对象, 这样可以节省内存,缺点是这样实现的动画效果比较僵硬,在这里值实现了雪花的纵向移动,并没有横向的效果。

可以对比前一篇雪花的动画效果,查看请戳。

转载于:https://www.cnblogs.com/hyhl23/p/4170415.html

你可能感兴趣的文章
jQuery on(),live(),trigger()
查看>>
【架构】Linux的架构(architecture)
查看>>
ASM 图解
查看>>
Date Picker控件:
查看>>
你的第一个Django程序
查看>>
treegrid.bootstrap使用说明
查看>>
[Docker]Docker拉取,上传镜像到Harbor仓库
查看>>
javascript 浏览器类型检测
查看>>
nginx 不带www到www域名的重定向
查看>>
记录:Android中StackOverflow的问题
查看>>
导航,头部,CSS基础
查看>>
[草稿]挂载新硬盘
查看>>
[USACO 2017 Feb Gold] Tutorial
查看>>
关于mysql中GROUP_CONCAT函数的使用
查看>>
OD使用教程20 - 调试篇20
查看>>
Java虚拟机(JVM)默认字符集详解
查看>>
Java Servlet 过滤器与 springmvc 拦截器的区别?
查看>>
(tmp >> 8) & 0xff;
查看>>
linux命令之ifconfig详细解释
查看>>
NAT地址转换
查看>>