CALayer应用

当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,将会显示一个有轻微模糊的黑色阴影稍微在图层之上

  1. shadowColor和 borderColor 和 CGColorRef 。阴影 默认是黑色,大多数时候你需要的阴影也是黑色的(其他颜色的阴影看起来是不是 有一点点奇怪。。。
  2. shadowOffset属性控制着阴影的方向和距离。它是一个 CGSize 的值,宽度控制这阴影横向的位移,高度控制着纵向的位移。 shadowOffset 的默认值是 {0, -3},意即阴影相对于Y轴有3个点的向上位移。
    在这里插入图片描述
  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-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值