zoukankan      html  css  js  c++  java
  • iOS frame和Bounds 以及frame和bounds区别

    frame

    frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的。
    位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有的坐标系,如下图:


    iOS坐标系
    • 在iOS坐标系中以左上角为坐标原点,往为X正方向,往是Y正方向
    • frame中的位置是以父视图的坐标系为标准来确定当前视图的位置
    • 同样的默认情况下,本视图的左上角就是子视图的坐标原点
    • 更改frame中位置,则当前视图的位置会发生改变
    • 更改frame的大小,则当前视图以当前视图左上角为基准的进行大小的修改

    bounds

    bounds是每个View都有的属性,这个属性我们一般不进行设置,他同样代表位置和大小;
    每个视图都有自己的坐标系,且这个坐标系默认以自身的左上角为坐标原点,所有子视图以这个坐标系的原点为基准点。
    bounds的位置代表的是子视图看待当前视图左上角的位置;bounds的大小代表当前视图的大小;

    • 更改bounds中的位置对于当前视图没有影响,相当于更改了当前视图的坐标系,对于子视图来说当前视图的左上角已经不再是(0,0), 而是改变后的坐标,坐标系改了,那么所有子视图位置也会跟着改变
    • 更改bounds的大小,bounds的大小代表当前视图的长和宽,修改长宽后,中心点继续保持不变, 长宽进行改变;通过bounds修改长宽看起来就像是以中心点为基准点对长宽两边同时进行缩放;

    frame和bounds

    有如下图:


    iOS bounds

    View A是最顶层视图, 因此他的信息如下:
    frame
    origin:0, 0
    size :550 * 400

    bounds
    origin:0, 0
    size 550 * 400

    因为是View A是顶层视图,所以其实相当于覆盖在框架上,因此位置从父视图的(0, 0)开始,大小为550*400
    默认情况下,本视图的坐标系是没有发生改变的即当前视图(view A)的左上角就是所有子视图的原点,大小就是当前视图的大小.

    View B是View A的子视图,因此他的信息如下:
    frame
    origin:200, 100
    size :200 * 250

    bounds
    origin:0, 0
    size :200 * 250

    因为View B是View A的子视图,所以View B的frame位置需要以View A的左上角为参照,因此位置为(200, 100), 大小为200*250
    bounds在默认情况下本视图的坐标系是没有发生改变的即当前视图(view B)的左上角就是当前视图所有子视图的原点.

    上面这种是普通的情况,也就是没有更改bounds的时候,下面我们来看更改bounds的例子, 如下图:


    iOS bounds

    在上一个例子的基础上,我们更改了view A的bounds后,view B看待View A的左上角就已经发生改变了;这个时候我们看待View A的左上角就不是坐标原点了,而是我们通过bounds设置后的坐标,如图也就是(0, 100);
    在View B的frame没有保存不变的基础上,我们View B的位置向上移动了100

    在第一例的基础上,更改了bounds中X后,效果图如下:


    iOS bounds 3

    总结

    1、frame不管对于位置还是大小,改变的都是自己本身
    2、frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置
    3、frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变
    2、bounds改变位置时,改变的是子视图的位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角
    3、bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就想缩放一样

    另:

    下图 red view 原始frame 为

    CGRectMake(200, 200, 100, 100)];

     改变bounds为

    view.bounds=CGRectMake(0, 100, 200, 200);

    //frame (origin = (x = 150, y = 150), size = (width = 200, height = 200))

    在red view上放置跟他同样大小的yellow button ,

    btn.frame=CGRectMake(0, 0, 200, 200);

    发现点击red view之外的button没有用,只有点击有效部分才有效果。

     

  • 相关阅读:
    length()与trim()函数用法
    软件测试面试题集锦
    数据库索引介绍
    sum 函数语法与应用
    报表测试方法与注意事项
    添加、编辑、删除功能测试点
    登陆测试思路总结
    查询功能测试点总结
    case 函数语法与使用
    js获取地址栏上的Id值
  • 原文地址:https://www.cnblogs.com/dannygao/p/7237198.html
Copyright © 2011-2022 走看看