美文网首页iOS Developer程序员ios 知识点
给view添加subViwe你只会用[objc.view add

给view添加subViwe你只会用[objc.view add

作者: 饭饭男 | 来源:发表于2016-11-25 16:21 被阅读946次

    -------在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];
    

    以上三个方法的优点就是 在添加视图的时候足够灵活 ,你可以随意位置的去创建视图,不用担心视图的创建添加顺序以及创建的位置。哪怕多个视图分离在多个代码块中 依然一句话就完成位置指派。可以大大提高我们开发的效率。

    相关文章

      网友评论

        本文标题:给view添加subViwe你只会用[objc.view add

        本文链接:https://www.haomeiwen.com/subject/dmfwpttx.html