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方法的动画块的名字
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方法的动画块的名字
相关文章推荐
- 使用symbolicatecrash分析iOS Crash文件
- iOS多线程之GCD
- iOS -NSArray
- iOS -强制转化
- iOS - 重写init方法的注意事项
- iOS -加载自定义xib
- iOS开发系列--通知与消息机制
- iOS iOS8中 问题"registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later" 解决方案
- sencha touch打包问题(IOS7.x +iphone4 真机安装失败)
- iOS 保持界面流畅的技巧
- iOS pushmebaby 常见错误解析
- iOS-NSString
- iOS之block
- iOS-id类型
- ios中使用SegmentedControl来切换视图
- iOS之引用计数
- iOS-各种报错,各种error
- 打包测试 之 之 iOS Provisioning Profile(Certificate)与Code Signing详解
- iOS8系统H264视频硬件编解码说明
- iOS 通过(lame)将录制音频转换成Mp3