游戏开发工具

图层树之图层的能力

本节引言

在iOS APP开发过程中,能看得见的控件都是基于UIView,比如UILabel,UIButton,UITextView等等,这些控件的属性及方法能满足大部分的开发需求,但是仍有些需求,比如圆角,阴影,边框等等,UIView是做不到的,而CALayer就可以满足这些特殊的需求了,那么CALayer又是什么呢?本文将对CALayer做一些简单的总结。

CALayer是什么

An object that manages image-based content and allows you to perform animations on that content.

一个管理基于图像的内容并允许对该内容执行动画的对象。


说的通俗点就是CALayer能够显示具体的图像,并且还能执行动画。Layer的主要工作就是用来展示我们设置的视图,它自身也有一些可以设置的属性,比如背景色,边角框等等,另外Layer还能记录它所展示内容的位置,大小等一些几何信息。

那么Layer用来显示内容了,UIView是干什么的呢?

UIView是构建视图的基础模块,定义了所有视图共有的行为,并管理其内部所有视图的交互行为。

所以我们可以粗略的划分为:Layer是用来显示内容的,并保持内容的几何信息,View则是用来处理用户交互,事件,以及响应链。

比如下图,我们所看到的全都是Layer。

1.jpg



在iOS系统中,每当创建一个View的时候,便会自动创建一个Layer与View绑定,并自动将Layer的代理设置为View,我们不应改变这个关系。如果是我们手动创建的Layer,那么我们可以指定Layer的代理,并通过这个代理给Layer提供内容。

CALayer的简单使用

开发中,有些需求必须使用CALayer的相关属性,而有些需求可以使用UIView的,也可以使用CALayer的,但是如果使用了CALayer的属性,可能会更简洁一些。

下面看一些属性的简单使用:

// 一个能为Layer提供内容的对象
var contents: Any?
 
// Layer的比例因子,避免Retina屏幕显示错误,等同于屏幕的比例因子。
var contentsScale: CGFloat


例如下面代码:

override func viewDidLoad() 
{
	super.viewDidLoad()
	self.view.layer.contents = UIImage(named: "image_0.jpg")?.cgImage
	self.view.layer.contentsScale = UIScreen.main.scale
}


运行效果如下:

2.jpg



整个屏幕显示了一张照片,这样做的一个好处就是,如果背景要是设置一个全屏幕照片,则省去了添加UIImageView了。

contentsGravity & masksToBounds

// 设置Layer内部内容的显示模式,和UIView的ContentMode相似。
var contentsGravity: CALayerContentsGravity
 
// 是否将超出super layer边框部分的内容裁掉,默认值为false。等同于UIView的clipsToBounds属性。
var masksToBounds: Bool


CALayerContentsGravity可选值列表如下:

3.jpg


示例如下:

5.jpg

6.jpg

7.jpg


contentsRect

// 单位坐标空间中的矩形,它定义了图层中应该使用的内容部分。默认值为{0, 0, 1, 1}全部显示,取值范围为0到1.
var contentsRect: CGRect

这个属性决定了显示内容的哪一部分,它使用的是单位坐标,比如 imageLayer.contentsRect = CGRect(x: 0, y: 0, width: 0.5, height: 0.5) 就是显示图片的左上角这四分之一的区域。


显示如下:

1.jpg


其他属性:

Layer还有很多其他的属性,比如:背景色、边框、阴影、透明度、等等,这些都是开发中大家已经用的很熟的了,这里面就不再赘述了。


本节小结:

本文简单介绍了CALayer的定义以及与UIView的关系,还介绍了一些CALayer的属性,文章略显简短,有些重要的属性及方法原理等,后续会有单独文章阐述。