iOS-深入UI

layer的 frame、bounds、position 和 a

2017-05-12  本文已影响345人  whlpkk

        视图的center属性和图层的position属性都指定了anchorPoint相对于父图层的位置。图层的anchorPoint通过position来控制它的frame的位置,你可以认为anchorPoint是用来移动图层的把柄。
        默认来说,anchorPoint位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint属性并没有被UIView接口暴露出来,这也是视图的position属性被叫做“center”的原因。但是图层的anchorPoint可以被移动,比如你可以把它置于图层frame的左上角,于是图层的内容将会向右下角的position方向移动,而不是居中了。如下图1:


图1



        anchorPoint的效果如下图2:

图2



        当anchorPoint不在中心的时候,的效果如下图3:

图3

frame

        frame是一个派生属性,是根据layer的boundsposition(center)archorPointtransform计算出来的。
        当改变boundsposition(center)archorPointtransform当中的任何一个值时,frame都会发生变化。具体步骤如下:

  1. 首先根据boundsposition(center)archorPoint计算出变换前的frame
  2. 根据变换前的frametransform计算出变换后的frame
  3. 当变换后的frame是一个平行四边形或者不平行与边轴时,返回一个最小的包括变换后的frame的四个顶点的矩形,这个矩形就是真实的frame

        当改变frame时,archorPointtransform不变,boundsposition(center)随之改变。具体步骤如下:

  1. 首先根据frametransform计算出变换前的frame。
  2. 根据变换前的framesize修改bounds属性。
  3. 根据变换前的framearchorPoint修改position(center)属性。

bounds

        通过get和set方法,直接读取layer的bounds属性。
        当改变frame时,bounds会改变。
        当改变bounds时,frame随之改变,原理看frame段落。

center(position)

        通过get和set方法,直接读取layer的position属性。
        当改变frame时,position(center)会改变。
        当改变position(center)时,frame随之改变,原理看frame章节。

archorPoint

        layer的属性,用于记录坐标变换时坐标系的原点。取值范围(0,0)~(1,1)。(0,0)表示以view的左上角为坐标原点进行坐标变换。(1,1)表示右下角。
        当改变frame时,archorPoint不变。
        当改变archorPoint时,frame随之改变,原理看frame章节。

transform(view的transform)

        view的transform属性是直接调用的layer的affineTransform属性的get和set方法。affineTransform实际上是一个计算属性,当layer调用affineTransform的set方法时,实际上是换算为CATransform3D类型的结构体,赋值给layer的transform属性。同理调用affineTransform的get方法时,也是通过layer的transform属性换算为 CGAffineTransform返回的。换句话说,view的transform属性等同于layer的affineTransform属性,是通过get和set方法取的layer的transform的值。
        当改变frame时,transform不变。
        当改变transform时,frame随之改变,原理看frame章节。

上一篇 下一篇

猜你喜欢

热点阅读