每年过年的时候,火车站排队买票或者取票的真是人山人海啊,在排队买票的时候会出现这么几种情况,第一种,当排头的人买玩票后,后面的人会自发往前排。第二种情况,当后面的人因为听说自己去的地方已经没有票了,或者看排得队太长,现在正好有急事退出队伍后,后面的人自动往前挪动位置 ,其实总而言之这说的就是一种情况,就是不管队列中那个人离开,其后面的人都会自动补上,问题看似非常简单,但是问题在于,计算机不是人啊,人看见前面的人不在会自动补上,但计算机没有思想啊,必须我们告诉他怎么做,他才能在任意一个对象隐藏(这里默认把人的离开理解为对象的隐藏)后,后面的对象自动往前补上,现在我们就来解决这个问题。
1.首先我们假设有5个视图在排队,他们分别是小明,小红,小刚,小美,小江,首先在.h文件中把他们在设置成属性(方便在类内类外调用)并在.m文件中创建他们并添加到视图中,并设置一个队列数组属性,也就是他们所在的队列。
.h
@property(nonatomic,strong)UIView*xiaoming;
@property(nonatomic,strong)UIView*xiaohong;
@property(nonatomic,strong)UIView*xiaogang;
@property(nonatomic,strong)UIView*xiaomei;
@property(nonatomic,strong)UIView*xiaojiang;
@property(strong,nonatomic)NSMutableArray* datas;
.m
self.xiaoming =[[UIView alloc]initWithFrame:CGRectMake(50, 0, 50, 50)];
self.xiaohong =[[UIView alloc]initWithFrame:CGRectMake(50, 0 ,50, 50)];
self.xiaogang =[[UIView alloc]initWithFrame:CGRectMake(50,0, 50, 50)];
self.xiaomei =[[UIView alloc]initWithFrame:CGRectMake(50, 0, 50, 50)];
self.xiaojiang =[[UIView alloc]initWithFrame:CGRectMake(50, 0, 50, 50)];
_myview1.backgroundColor=[UIColor redColor];
_myview2.backgroundColor=[UIColor yellowColor];
_myview3.backgroundColor=[UIColor blueColor];
_myview4.backgroundColor=[UIColor greenColor];
_myview5.backgroundColor=[UIColor purpleColor];
[self.view addSubview:_xiaoming];
[self.view addSubview:_xiaohong];
[self.view addSubview:_xiaogang];
[self.view addSubview:_xiaomei];
[self.view addSubview:_xiaojiang];
2.现在我们已经创建好所有要排队的人了,现在我们就要在.m文件中按顺序把他们添加到数组队列中,千万别忘了初始化数组,
.m
_datas =[NSMutableArray array];
[_datas addObject:_xiaoming];
[_datas addObject:_xiaohong];
[_datas addObject:_xiaogang];
[_datas addObject:_xiaomei];
[_datas addObject:_xiaojiang];
虽然现在我们把所有的人都添加到数组队列当中,现在假设我们让_xiaoming在viewdidload方法里离开,也就是隐藏他
_xiaoming.hidden =YES;
既然
_xiaoming已经离开,那么队伍就要进行重新排序,也就是最关键的一步进入排序方法,假设这个方法的名字叫-(void)refresh
在这个方法里执行
{
CGfloat x1 =10;
-(void)refresh
{
1.CGFloat y1=10;
2. for (UIView*str in _datas)
{
3. if (str.hidden)
{
}4.else{
4.1str.frame=CGRectMake(str.frame.origin.x,y1, str.frame.size.width, str.frame.size.height);
4.2 y1+=str.frame.size.height+space;
}
}
}
1.因为是纵向排序,在这里y1也就以第一个人的纵坐标
2.然后循环队列里的每一个元素
3.如果隐藏的话,就隐藏
4.如果没隐藏,
4.1.剩下的元素的坐标= 自身的横坐标,y1,自身的宽,自身的高
4.2.在这里假设他们横向(横坐标)是不变的,自己的身高,宽度也是不变的,变的只有他们的竖向(纵坐标)的位置,所以在这里剩下的人的竖向位置(纵坐标的位置)以第一个人的纵向位置为基准,每次循环添加他们之间的距离(可以在.m文件中设置成宏#define space 15),和本身的高度(因为这里假设是平面的)
横向排得话只用反过来就行了
到现在位置只要在viewdidload方法里随意隐藏一个,就可以自动排序了。