在前面的iOS开发Core Animation学习总结(二)已经知道什么是CALayer、CALayer的创建过程、CALayer的基本属性、UIView和CALayer的区别和联系。现在我对其中的几个重要的属性总结一下:

1.anchorPoint和position

anchorPoint 锚点和position是永远物理重合的,重点在于position是相对于superLayer的point,anchorPoint是相对于自身layer。

如果不理解它们的关系可以查看前面文章:iOS开发Core Animation学习总结(一)

下面总结了一些计算方法:

  • 1.

    /**
     *  已知Layer的frame来获取Layer的bounds
     *
     *  @param frame       frmae
     *
     *  @return Layer的bounds
     */
    - (CGRect)getLayerBoundsFromLayerFrame:(CGRect)frame{
        return  CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame));
    }
    
  • 2.

    /**
     *  已知Layer的frame和anchorPoint(默认(0.5,0.5))来获取Layer的position
     *
     *  @param frame       frmae
     *  @param anchorPoint anchorPoint
     *
     *  @return Layer的position
     */
    - (CGPoint)getLayerPositionFromLayerFrame:(CGRect)frame anchorPoint:(CGPoint)anchorPoint{
    
        CGFloat x = CGRectGetMinX(frame)+ anchorPoint.x*CGRectGetWidth(frame);
        CGFloat y = CGRectGetMinY(frame)+ anchorPoint.y*CGRectGetHeight(frame);
        CGPoint position = CGPointMake(x,y);
        return position;
    }
    
  • 3.

    /**
     *  已知Layer的position、anchorPoint(默认(0.5,0.5))和bounds来获取Layer的frame
     *
     *  @param position    position
     *  @param anchorPoint anchorPoint
     *  @param bounds      bounds
     *
     *  @return frame
     */
    - (CGRect)getLayerFrameFromPosition:(CGPoint)position anchorPoint:(CGPoint)anchorPoint bounds:(CGRect)bounds{
    
        CGFloat originX = position.x - anchorPoint.x*CGRectGetWidth(bounds);
        CGFloat originY = position.y - anchorPoint.y*CGRectGetHeight(bounds);
        CGRect layerFrame = CGRectMake(originX, originY, CGRectGetWidth(bounds), CGRectGetHeight(bounds));
        return layerFrame;
    }
    

2.mask(遮罩层)

设置contentLayer的mask的时候,mask也是layer图层,超出masklayer的contentLayer不会被显示.

3.maskToBounds

父图层是否对超过父视图范围的子图层部分进行裁剪 设置阴影不会有显示效果。

当设置UIImageView的圆角的时候 它的图像并没有设置成圆角 必须将maskToBounds设置为yes,是因为图像在layer中绘制的时候会新建一个子layer绘制,layer设置成圆角它的子layer并没有,所以子layer的bounds大于layer的,maskToBounds属性值默认为NO,设置为Yes会剪切子Layer外框.

CALayer的maskToBounds 类似与UIView的clipsToBounds,作用是一样的。