随机数方法
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方法的动画块的名字