CALayer图层结构
我们先来看一张layer图层的结构图,如下:
图层渲染时候,backgroundColor最底下,contents内容居中(一般该对象是一个CGImageRef对象,可通过contentsGravity属性设置图片展示模式,是平铺整个bounds还是等比例展示),border在最上面,如果该layer有子layer,则子layer也显示在boarder下面。
CALayer拥有mask属性,Apple的官方解释如下:
An optional layer whose alpha channel is used to mask the layer’s content.
The layer’s alpha channel determines how much of the layer’s content and
background shows through. Fully or partially opaque pixels allow the
underlying content to show through but fully transparent pixels block
that content.
mask同样也是一个CALayer。假设将CALayer本身称为ContentLayer, 将mask称为MaskLayer,蒙版(Masking)的工作原理是通过MaskLayer 的alpha值定义ContentLayer的显示区域:对于ContentLayer上每一个Point, 计算公式为ResultLayer = ContentLayer * MaskLayer_Alpha。 所以当alpha为1时Content显示,alpha为0时Content不显示, 其他处于0与1之间的值导致Content半透明。
1.mask 是CALayer的一个属性,同时也是CALayer 类型的。 2.原理:控制layer本身渲染的一个layer。效果是:比如imageLayer有一个maskLayer作为mask(注意maskLayer可以不跟imageLayer大小一样),那maskLayer透明的地方,imageLayer就不会渲染,而是变透明,显示出imageLayer之后的内容,maskLayer不透明的地方,imageLayer就会正常渲染,显示出imageLayer本来的内容如果maskLayer比imageLayer要小,那默认的maskLayer之外的地方都是透明的,都不会渲染。 3.mask 的作用就是让父图层部分区域可见。 4.mask 的backgroundColor必须设置,不设置mask 背景就是透明的,mask 是不会起作用的,但是backgroundColor设置什么颜色无所谓。 5.为一个layer的mask 创建一个新的mask时,这个新的mask不能有superlayer 和sublayer。(官方文档的说明) 6.mask 可以配合CAGradientLayer、CAShapeLayer 使用。可以实现蒙层透明度、显示不同形状图层、图案镂空、文字变色等等功能。 7.mask在动画中使用,可以产生很好的动画效果。
影响mask行为的因素 就是mask图层(是遮罩层,而不是被遮罩层哦~)的透明度,透明度的取值范围(0,1),而CALayer里有两个主要的属性和透明度有关,就是contents属性和backgroundCorlor属性。我们用contents最多的就是给它赋值一个图片,而图片是有透明通道和无透明通道的,backgroundColor属性也是有透明度的(mask不关心是什么颜色,只关心颜色的透明度),而且clearColor的透明度是0,可以去查看UIColor的API。
当mask图层完全透明时,即透明度为0,则遮罩区域不显示
当mask图层完全不透明时,即透明度为1,则遮罩区域显示
当mask图层的透明度值在0~1之间,则mask图层会和被遮罩层内容混合
需要注意的是:
MaskLayer的color不重要,主要使用opacity(CALayer中的alpha), 但是注意[UIColor clearColor]其实就是alpha为0的color。 ContentLayer超出MaskLayer以外的部分不会被显示出来。 MaskLayer不能有superLayer,否则蒙版(Masking) 的结果就是未知(Undefined)。 由于mask是一个CALayer,可以通过组合产生很多非常棒的效果。 例如可以将MaskLayer指定为CAGradientLayer类型实现Gradient效果, 可以给MaskLayer添加动画。