您的位置:首页 > 移动开发 > IOS开发

iOS -雪花动画

2016-03-11 16:38 295 查看
随机数方法

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方法的动画块的名字
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: