-------在iOS日常开发中如果我们给一个视图添加一个子视图通常的做法就是[objc.view addSubView:]--------
Demo地址:https://github.com/huxiao123/addSubViewDemo
这样做是没错,信手拈来,但问题是addSubView添加的子视图永远被添加在了当前视图的最上方,缺少自定义。子视图是以栈的方式存放的,每次addsubview时都是在最后面添加。
我们通过[self.view.subViews count]可以获取当前view上有多少个子视图。一般一个UIViewController刚刚创建什么都不添加的时候默认有两个子视图,一个window 一个self.view 所以一个UIViewController中的所有视图= 一个window + 一个self.view + [self.view.subViews count]
其实iOS系统为我们另外提供了很多方式,可以让我们很灵活的改变视图的位置,想怎么添加就怎么添加、
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview;
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
- (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2
- (void)bringSubviewToFront:(UIView *)view;
- (void)sendSubviewToBack:(UIView *)view;
今天我们只介绍前三种
/*
将view添加到指定的index处
*/
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
我们用例子来掩饰
屏幕快照 2016-11-25 下午3.40.08.png
UIView *redView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
UIView *blueView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 100, 100)];
blueView.backgroundColor = [UIColor blueColor];
[self.view addSubview:blueView];
NSLog(@"self.view.subviews.count = %ld",self.view.subviews.count);
UIView *greenView = [[UIView alloc]initWithFrame:CGRectMake(125, 125, 100, 100)];
greenView.backgroundColor = [UIColor greenColor];
//加载到视图的第2个位置
[self.view insertSubview:greenView atIndex:1];
我们先重建了一个redView视图 再重建了blueView视图 再重建了greenView视图 使用 [self.view addSubview:]依次将redView,blueView添加到当前视图中,那么按照显示顺序blueView肯定在redView之上显示。现在有个要求,我们想把greenView添加到redView与blueView之间。也许这时有些人会想我只要把greenView代码写在redView和blueView之间就行了啊,那么我告诉你,如果greenView是和其他两个视图分离在两个模块中 你怎么写?这时灵活的[self.view insertSubview:atIndex:1]就可以上场了 它不在乎你代码的实现位置在那里,我都可以自定义位置添加。
/*
将view添加到指定的视图之前
*/
- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview;
前面讲的方式是基于index的 后面这个两个方式是基于视图本身的
我们想讲greenView视图 添加在redView视图之前 可以这样实现
UIView *greenView = [[UIView alloc]initWithFrame:CGRectMake(125, 125, 100, 100)];
greenView.backgroundColor = [UIColor greenColor];
//加载到redView视图之下
[self.view insertSubview:greenView belowSubview:redView];
我们想讲greenView视图 添加在redView视图之后 可以这样实现
屏幕快照 2016-11-25 下午3.55.52.png UIView *greenView = [[UIView alloc]initWithFrame:CGRectMake(125, 125, 100, 100)];
greenView.backgroundColor = [UIColor greenColor];
[self.view insertSubview:greenView aboveSubview:redView];
以上三个方法的优点就是 在添加视图的时候足够灵活 ,你可以随意位置的去创建视图,不用担心视图的创建添加顺序以及创建的位置。哪怕多个视图分离在多个代码块中 依然一句话就完成位置指派。可以大大提高我们开发的效率。
网友评论