当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示。因此,通过操作这个CALayer对象,可以很方便地调整UIView的一些界面属性,比如:阴影、圆角大小、边框宽度和颜色等。
圆角
开发者应该都已经很熟悉conrnerRadius了,设置圆角,刚开始是在button上,但其实很多控件都有,想想只要有layer就有
注意:在view上可以直接设置conrnerRadius
但是在view上添加label或者button的话,要设置conrnerRadius的话就要添加masksToBounds为YES
图层边框
CALayer另外两个非常有用属性就是 borderWidth 和 borderColor
边框并不会把寄宿图或子图层的形状计算进来,如果图层 的子图层超过了边界,或者是寄宿图在透明区域有一个透明蒙板,边框仍然会沿着图层的边界绘制出来.
总之,边框就只会根据边界绘制,不会管子图层内容
阴影
给shadowOpacity属性一个大于默认值(也就是0)的值,阴影就可以显示在任意图层之下。 shadowOpacity 是一个必须在0.0(不可见)和1.0(完全不透 明)之间的浮点数。如果设置为1.0,将会显示一个有轻微模糊的黑色阴影稍微在图层之上
- shadowColor和 borderColor 和 CGColorRef 。阴影 默认是黑色,大多数时候你需要的阴影也是黑色的(其他颜色的阴影看起来是不是 有一点点奇怪。。。
- shadowOffset属性控制着阴影的方向和距离。它是一个 CGSize 的值,宽度控制这阴影横向的位移,高度控制着纵向的位移。 shadowOffset 的默认值是 {0, -3},意即阴影相对于Y轴有3个点的向上位移。
- shadowRadius属性控制着阴影的模糊度,当它的值是0的时候,阴影就和视图 一样有一个非常确定的边界线。当值越来越大的时候,边界线看上去就会越来越模 糊和自然。苹果自家的应用设计更偏向于自然的阴影,所以一个非零值再合适不过 了。
和图层边框不同,图层的阴影继承自内容的外形,而不是根据边界和角半 径来确定。为了计算出阴影的形状,Core Animation会将寄宿图(包括子视图,如 果有的话)考虑在内,然后通过这些来完美搭配图层形状从而创建一个阴影
完全根据图片内容绘制阴影
shadowPath属性
我们已经知道图层阴影并不总是方的,而是从图层内容的形状继承而来。这看上 去不错,但是实时计算阴影也是一个非常消耗资源的,尤其是图层有多个子图层, 每个图层还有一个有透明效果的寄宿图的时候。
如果你事先知道你的阴影形状会是什么样子的,你可以通过指定一 shadowPath 来提高性能。 shadowPath 是一个 CGPathRef 类型(一个指向 CGPath 的指针)。 CGPath 是一个Core Graphics对象,用来指定任意的一个 矢量图形。我们可以通过这个属性单独于图层形状之外指定阴影的形状。
layerView1.layer.shadowOpacity = 0.5f;
layerView2.layer.shadowOpacity = 0.5f;
CGMutablePathRef squarePath = CGPathCreateMutable();
CGPathAddRect(squarePath, NULL, layerView1.bounds);
layerView1.layer.shadowPath = squarePath;
CGPathRelease(squarePath);
CGMutablePathRef circlePath = CGPathCreateMutable();
CGPathAddEllipseInRect(circlePath, NULL, layerView2.bounds);
layerView2.layer.shadowPath = circlePath;
CGPathRelease(circlePath);
如果是一个矩形或者是圆,用 CGPath 会相当简单明了。但是如果是更加复杂一 点的图形, UIBezierPath 类会更合适
图层蒙板
CALayer有一个属性叫做mask,这个属性本身就是个 CALayer类型,有和其他图层一样的绘制和布局属性。它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。不同于 那些绘制在父图层中的子图层, mask 图层定义了父图层的部分可见区域。
关于mask的使用可看CALayer之mask使用从此不再纠结
当然还有许多拉伸,透明的效果,图层博大精深啊,后续继续学习吧
博客的图都来自这本书https://legacy.gitbook.com/download/pdf/book/zsisme/ios-