码迷,mamicode.com
首页 > 其他好文 > 详细

定时器与 UIView 动画结合的雪花降落的效果

时间:2014-12-17 22:25:06      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   io   color   使用   sp   for   on   

 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     self.window.backgroundColor = [UIColor whiteColor];
 9     [self.window makeKeyAndVisible];
10     
11     UIImageView *bg = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
12     bg.image = [UIImage imageNamed:@"xueshan.jpg"];
13     [self.window addSubview:bg];
14     
15     _snowArray = [[NSMutableArray alloc] init];
16     UIImageView *snow = nil;
17     for (int i  = 0; i < 50; i ++)
18     {
19         snow = [[UIImageView alloc] initWithFrame:CGRectMake(arc4random() % 320, -20, 20, 20)];
20         snow.image = [UIImage imageNamed:@"flake.png"];
21         snow.tag = 0;
22         [self.window addSubview:snow];
23         [_snowArray addObject:snow];
24     }
25     
26     [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(findSnow) userInfo:nil repeats:YES];
27     
28     
29     return YES;
30 }
31 
32 //找雪花
33 - (void)findSnow
34 {
35     UIImageView *aSnow = nil;
36     for (int i = 0; i < _snowArray.count; i ++)
37     {
38         aSnow = [_snowArray objectAtIndex:i];
39         if (aSnow.tag == 0)
40         {
41             aSnow.tag = 1;
42 //            [self snowDown:aSnow];  //如果将这句代码放在这里,后面的 else 以及后面的代码都可以不要,因为放在这里不会出现不被允许动画的雪花又被调用执行一次动画
43             break;
44         }
45         else
46         {
47             aSnow = nil;   //找雪花的时候没有一朵雪花是符合条件的,但这时候 aSnow 仍然有一个值,如果不让它指向空的时候,最后一朵雪花(第50朵)又被使用了一次,此时这多雪花下落的动画还没有结束,再次使用会造成意想不到的结果(有一朵雪花会往上飞)。这个 bug 折磨了我一天,最后还是老师帮助解决的,思维进入了一个误区,还真的是害人不浅。
48         }
49     }
50 
51     [self snowDown:aSnow];  //调用雪花动画的方法,即时让被找到的这朵雪花进行动画
52 }
53 
54 //让一朵雪花动画
55 - (void)snowDown:(UIImageView *)aSnow
56 {
57     [UIView beginAnimations:nil context:aSnow];
58     [UIView setAnimationDuration:7];
59     aSnow.frame = CGRectMake(arc4random() % 320 , 480, 20, 20);
60     [UIView setAnimationDelegate:self];
61     [UIView setAnimationDidStopSelector:@selector(restart:finished:context:)];
62     [UIView commitAnimations];
63 }
64 
65 - (void)restart:(NSString *)animationID finished:(NSNumber *)finished context:(void *)aSnow
66 {
67     UIImageView * snow = (UIImageView *)aSnow;
68     snow.frame = CGRectMake(arc4random() % 320, -20, 20, 20);
69     snow.tag = 0;
70 }//让已经下落到底部的动画重新定位到顶部,达到重用的效果,并且重置 tag 值,此时这多雪花就可以被重新找到,再次进行下落的动画
71 
72 /*
73  注意上面的定时器的时间间隔(0.14)以及雪花下落动画所需要的时间(7),以及数组的长度(50)
74  0.14 * 50 = 7
75  这个时间去的有点巧妙,这是一个临界值,本来我是本着不浪费的原则让每一朵雪花都能够没找到然后进
76  动画,然后出现了上面的 bug, 如果将时间间隔调小一点(雪花动画会出现断层,最后一朵雪花的动画
77  果也会受到影响,此时将数组长度减至10,会发现只有 9 多雪花进行了动画,原理同上),如果将时间
78  调大是可以解决问题的,因为此时在找到最后一朵雪花之前,已经有雪花重新在进行一轮动画了。
79  */
80 
81 @end

这种使用定时器与 UIView 动画结合制作的动画效果既不僵硬,然后又能够对雪花对象重用,节省了内存,是比较好的方式。

到这里,动画的学习已经结束了一个阶段,在使用过程中需要结合实际情况选择。

定时器与 UIView 动画结合的雪花降落的效果

标签:style   blog   ar   io   color   使用   sp   for   on   

原文地址:http://www.cnblogs.com/hyhl23/p/4170490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!