iOS -雪花动画

Posted 车宝的笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS -雪花动画相关的知识,希望对你有一定的参考价值。

随机数方法

 

arc4random()  //[0,2^32-1]; 

 

随机数声明

unsigned int randomNum=arc4random()% 320;

int i = randomNum ;

其中,unsigned 没有标记的 指的是只有正数,说明randomNum是正数

其中 arc4random() 的括号绝对不可以忘掉

 

随机数也可以直接用

snowView.frame = CGRectMake(arc4random() % 320 , 480-snowView.frame.size.height,snowView.frame.size.width, snowView.frame.size.height);

 

关于随机数的意外?

即使是在证明的时候不用unsigned,在使用时仍然是只有正数出现

但是如果在后面的使用过程中对randomNum进行求余运算,最后就会出现负值

这真是一个奇怪的现象

比如说

    for (int a=0; a<60; a++) {

        int randomNum=arc4random();

        int i=randomNum%320;

        NSLog(@"--------->>arc4random()为%d",arc4random()%320);

        

        NSLog(@"--------->>randomNum为%d",i);

    }

在写了这样的代码之后,输出的arc4random()为后面一直都是正数,而randomNum为后面就有负数出现

这到底是为什么呢?

 

答案:    

   for (int a=0; a<60; a++) 

   {

        int randomNum=arc4random();

        int i=randomNum%320;

        NSLog(@"--------->>arc4random()为%d",arc4random()%320);

        

        NSLog(@"--------->>randomNum为%d",i);

    }

在这段代码中,这里的int是有符号的32位,而arc4random()是无符号的32位,比int大很多,赋给int类型的变量时,超过int范围的随机数,第一个  1   会被当成符号(即负号)来看待,所以会出现负数

对范珍老师的崇拜如滔滔江水源源不绝,这老师太牛了,简直是无所不能啊

 

 

通过动画块传参数

            [UIView beginAnimations:nil context:(__bridge void*)snowView];

            [UIView setAnimationDuration:6];

            [UIView setAnimationDelegate:self];

            snowView.center=CGPointMake(arc4random()%320, 475);

            [UIView commitAnimations];

这里,context后面的参数是 void* 类型,貌似是c里面的?,所以需要桥接强制转换,bridge关键字可以使不同语言之间的变量相互转换

这里,动画块中使用了Delegate之后,动画结束之后就会自动调用DidStop方法

 

下面是系统提供的DidStop方法

-(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

{

    //snow melt

    UIImageView *snowView=(__bridge UIImageView*)context;

    [UIView beginAnimations:nil context:(__bridge void*)snowView];

    [UIView setAnimationDuration:1];

    [UIView setAnimationDelegate:self];

    [UIView setAnimationDidStopSelector:@selector(reAnimationDidStop:finished:context:)];

    snowView.alpha=0.1;

    [UIView commitAnimations];

    

}

 

这里,参数有三个,暫時不用写,而context后面的context代表的就是snowView,但是context是c语言中的,所以需要再次转换一下

 

区分两个动画块

因为只要动画块使用delegate,结束之后就会自动去调用DidStop方法,所以,如果有两个动画块,而只有一个DidStop方法,那么两个动画块结束之后都会去调用哪个方法,为了使不同的动画块结束之后进行不同的后续操作,需要给动画块命名,然后再DidStop语句中用if判断动画块的名字,然后执行相应操作

 

下面,给动画块命名的代码

[UIView beginAnimations:@"snowDown" context:(__bridge void *)(snowView)];

 

判断动画块名字的代码

 if ([animationID isEqualToString:@"snowDown"])

这里的animationID指的就是来调用这个DidStop方法的动画块的名字

以上是关于iOS -雪花动画的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别