美文网首页
Core Animation 学习笔记 图层几何学

Core Animation 学习笔记 图层几何学

作者: David_Cap | 来源:发表于2015-08-31 17:48 被阅读46次

    布局属性

    UIView有三个比较重要的布局属性:frame,bounds和center,CALayer对应地叫做frame,bounds和position。为了能清楚区分,图层用了“position”,视图用了“center”,但是他们都代表同样的值。

    frame代表了图层的外部坐标(也就是在父图层上占据的空间),bounds是内部坐标({0, 0}通常是图层的左上角),center和position都代表了相对于父图层anchorPoint所在的位置。

    UIView和Layer的布局属性.png

    视图的frame,bounds和center属性仅仅是存取方法,当操纵视图的frame,实际上是在改变位于视图下方CALayer的frame,不能够独立于图层之外改变视图的frame。

    对于视图或者图层来说,frame并不是一个非常清晰的属性,它其实是一个虚拟属性,是根据bounds,position和transform计算而来,所以当其中任何一个值发生改变,frame都会变化。相反,改变frame的值同样会影响到他们当中的值

    记住当对图层做变换的时候,比如旋转或者缩放,frame实际上代表了覆盖在图层旋转之后的整个轴对齐的矩形区域,也就是说frame的宽高可能和bounds的宽高不再一致了

    UIView选择示意.png

    锚点

    之前提到过,视图的center属性和图层的position属性都指定了anchorPoint相对于父图层的位置。图层的anchorPoint通过position来控制它的frame的位置,你可以认为anchorPoint是用来移动图层的把柄。

    默认来说,anchorPoint位于图层的中点,所以图层的将会以这个点为中心放置。anchorPoint属性并没有被UIView接口暴露出来,这也是视图的position属性被叫做“center”的原因。但是图层的anchorPoint可以被移动,比如你可以把它置于图层frame的左上角,于是图层的内容将会向右下角的position方向移动


    锚点示意.png

    ,而不是居中了。

    也就是,之后如果旋转图形或者frame的变化都是以这个点为基准,这就是锚点。

    Z坐标轴

    和UIView严格的二维坐标系不同,CALayer存在于一个三维空间当中。除了我们已经讨论过的position和anchorPoint属性之外,CALayer还有另外两个属性,zPosition和anchorPointZ,二者都是在Z轴上描述图层位置的浮点类型。

    注意这里并没有更深的属性来描述由宽和高做成的bounds了,图层是一个完全扁平的对象,你可以把它们想象成类似于一页二维的坚硬的纸片,用胶水粘成一个空洞,就像三维结构的折纸一样。

    zPosition属性在大多数情况下其实并不常用。在第五章,我们将会涉及CATransform3D,你会知道如何在三维空间移动和旋转图层,除了做变换之外,zPosition最实用的功能就是改变图层的显示顺序了。

    通常,图层是根据它们子图层的sublayers出现的顺序来类绘制的,这就是所谓的画家的算法--就像一个画家在墙上作画--后被绘制上的图层将会遮盖住之前的图层,但是通过增加图层的zPosition,就可以把图层向相机方向前置,于是它就在所有其他图层的前面了(或者至少是小于它的zPosition值的图层的前面)。

    这里所谓的“相机”实际上是相对于用户是视角,这里和iPhone背后的内置相机没任何关系。

    下面,我们举个🌰,看看zPosition改变图层显示顺序的。先看下面代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.\
        
        UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 100, 100)];
        [self.view addSubview:view1];
        view1.backgroundColor = [UIColor redColor];
        
        UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
        [self.view addSubview:view2];
        view2.backgroundColor = [UIColor blueColor];
        
    }
    

    这样的话显示样子就如下:

    没有改变zPosition.png

    如果改变一下layer.zPosition的话,那么就能把view1拉到相机的前面来。

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.\
        
        UIView *view1 = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 100, 100)];
        [self.view addSubview:view1];
        view1.backgroundColor = [UIColor redColor];
        
        UIView *view2 = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 100, 100)];
        [self.view addSubview:view2];
        view2.backgroundColor = [UIColor blueColor];
        //
        view1.layer.zPosition += 1.0;
        
    }
    

    如图:

    改变zPosition.png

    相关文章

      网友评论

          本文标题:Core Animation 学习笔记 图层几何学

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