两个定时器(下落和寻找。回收机制)。固定位置和大小。
//创建一个存放雪花的数组
{
NSMutableArray *_flakeArray;
}
- (void)viewDidLoad {
[super viewDidLoad];
//初始化数组
_flakeArray= [[NSMutableArray alloc] initWithCapacity:0];
//往数组中添加雪花视图
for(inti = 0; i < 20; i ++) {
UIImageView *flake = [[UIImageView alloc] initWithFrame:CGRectMake(-40, -0, 40, 40)];
//设置雪花的tag值标记,0表示在初始位置,1表示不在初始位置
flake.tag= 0;
//添加图片
flake.image= [UIImage imageNamed:@"flake.png"];
//显示图片
[self.view addSubview:flake];
//把雪花视图放到数组里
[_flakeArray addObject:flake];
}
//输出数组,检验添加是否正确(图片名字是否正确,创建全局变量,创建数组)
//NSLog(@"%@",_flakeArray);
//找雪花的定时器
[NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(findFlake) userInfo:nil repeats:YES];
//找雪花逻辑:我们给每一个雪花进行标记0,用定时器调用方法找雪花,每一次找雪花都会遍历雪花数组,找到一个标记为0的雪花,把放到屏幕顶部,改变标记为1,结束寻找,如果从数组中取出的雪花标记为1,不进行操作,继续循环找下一个,直到找到一个标记为0的雪花,或者循环结束
//让所有标记为1的雪花下落
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(flakeDown) userInfo:nil repeats:YES];
//雪花下落的逻辑:我们可以把初始位置看做一个回收站,回收站里的雪花的标记都为0,在屏幕上的雪花标记都为1,用遍历数组找到所有标记为1的雪花,改变其纵坐标使其下落,如果某一个雪花落到屏幕底部,那就回收这个雪花,把他的位置放回到回收站,然后改标记为0
}
//找雪花的方法
- (void)findFlake {
//从数组找雪花
//遍历数组:用for循环,把数组里面的元素全部取出
for(inti = 0 ; i <_flakeArray.count; i ++) {
//UIImageView *flake = [_flakeArray objectAtIndex:i];
UIImageView *flake =_flakeArray[i];
//从初始位置找到一个雪花,放到屏幕顶部
if(flake.tag== 0) {
//把这个雪花放到屏幕顶端
flake.frame=CGRectMake(arc4random()%281, -40, 40, 40);
//改变tag标记
flake.tag= 1;
//找到一个雪花之后跳出循环
break;
}
}
}
//雪花下落的方法
- (void)flakeDown {
//遍历数组
for(UIImageView *flake in _flakeArray) {
//找到所有tag值为1的雪花,使其下落
if(flake.tag== 1) {
int y = flake.frame.origin.y;
y ++;
//重新定义雪花的位置更新位置
flake.frame=CGRectMake(flake.frame.origin.x, y, 40, 40);
//边界底部:如果雪花落到屏幕底部,
if(y >= 480) {
//回收雪花
flake.frame=CGRectMake(-40, 0, 40,40);
flake.tag= 0;
}
}
}
}