美文网首页
iOS开发笔记——frame与bouns详解

iOS开发笔记——frame与bouns详解

作者: 勤奋的小卫子 | 来源:发表于2018-12-03 23:15 被阅读0次

    1.iOS坐标系

    iOS坐标系中,以屏幕左上角为坐标原点,往右是X正方向,往下是Y正方向

    iOS坐标系

    boundsframe都是属于CGRect类型的结构体,包含一个CGPoint(起点)和一个CGSize(尺寸)子结构体。

    struct CGRect{
            CGPoint origin;
            CGSize size;
    };
    

    origin决定view的起点,size决定view的尺寸

    2.frame

    frame表示view在父view坐标系统中的位置和大小,参考坐标是父视图的坐标系统。
    代码示例:

        UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
        [viewA setBackgroundColor:[UIColor blueColor]];
        [self.view addSubview:viewA];
        
        UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
        [viewB setBackgroundColor:[UIColor yellowColor]];
        [viewA addSubview:viewB];
        
        UIView *viewC = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 50, 50)];
        [viewC setBackgroundColor:[UIColor redColor]];
        [self.view addSubview:viewC];
    

    运行效果:


    图一

    小结:
    viewBviewC起点重合,viewB的起点为 (50,50),而viewC的起点为(100,100)。原因是frame中的位置以父坐标为标准来确定当前视图位置,viewB的视图为viewAviewC的视图为self.view,而viewA的起点为(50,50),因此viewCviewB起点才会重合。

    3.bounds

    这个属性一般不进行设置,表示view在本地坐标系统中的位置和大小,参考点是本地坐标系统,而本地坐标系统原点默认为(0,0)
    每个视图都有自己的坐标系,且坐标系默认以自身左上角为坐标原点,所有子视图都以这个坐标系原点为基准点。

    • 更改bounds中的位置不会对本视图产生影响,但是会影响子视图的位置,因为这更改了当前视图的坐标系,对应子视图来说当前视图的左上角已经不再是(0,0),而是更改后的坐标。
    • 更改bounds的大小,bounds的大小代表当前视图的长和宽,当前视图的中心点保持不变,长宽进行改变,看起来像是以中心点为基准点对长宽两边同时进行缩放。

    4.两者区别

    直接上源码

    -(CGRect)frame{
        return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
    }
    -(CGRect)bounds{
        return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
    }
    

    4.1 origin区别

    可以很明显看·origin不同,frameorigin是不定的,而bounds(0,0),在不修改bounds情况下。

    4.2 size区别

    framesize直接决定view大小,而boundssize修改后,view中心点不变,长宽以中心点为基准缩放。
    代码示例:

    UIView *viewA = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
        [viewA setBackgroundColor:[UIColor blueColor]];
        [self.view addSubview:viewA];
        
        UIView *viewB = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 160, 120)];
        [viewB setBackgroundColor:[UIColor redColor]];
        [viewA addSubview:viewB];
        
        //viewB设置size(320,160)
        [viewB setBounds:CGRectMake(0, 0, 200, 160)];
    
    

    运行效果:


    更改bounds前 更改bounds后

    5.总结

    • frame不管改变位置还是大小,都会影响自己。
    • frame以父视图的坐标系作为参考,从而确定当前视图在父视图的位置。
    • frame大小改变时,当前视图左上角位置不会发生改变,只是大小变化。
    • bounds改变位置时,不会影响自身,子视图的位置会发生变化,默认自身坐标系原点是左上角
    • bounds大小改变时,当前视图的中心点不会变化,以中心点向四周伸缩。

    相关文章

      网友评论

          本文标题:iOS开发笔记——frame与bouns详解

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