在iOS中所谓的核心动画在表面上理解是视图的在二维或三维空间上位置,大小,角度等方面的变化, 在视觉效果上给用户一种赏心悦目的感觉, 在介绍核心动画之前我们先了解一下图层和视图的关系.
视图和图层
一个视图就是在屏幕上显示的一个矩形块(图片,视频等),他能够拦截类似于触摸手势等用户的输入,视图在层级关系中可以相互嵌套,其中一个视图可以管理它的所有位置.
CALayer
CALayer类和UIView很形似,在CALayer上也可以添加(图片,视频等).其中UIView和CALayer最大的区别CALayer不处理用户的交互.UIView和CALayer是一种相互平行的关系.
例如:当你在CALayer上添加一个image(图片时)你会发现与你之前在UIView上添加的图片,两者在位置上会有差距, 在Xcode中你可以观察一下图层视图, 如果在CALayer下添加图片其图片的位置会与图层在同一界面, 如果你在UIView上面添加图片会发现图片并不会与view在同一视图层,示例如下
那么既然UIView上面能放图片,视频.那么为什么开发者还要生成CALayer这个类呢,CALayer类有很多辅助的功能:
(1). 阴影, 圆角, 带颜色的边框
(2). 3D变化
(3). 非矩形范围
(4). 透明遮罩
(5). 多级非线性动画
在CALayer中有很多属性可以改变图片的动画,其属性有:
CGRect bounds
CGPoint position 用来设置CALayer在父层中的位置
以父层的左上角为原点(0, 0, 0)三维 或 (0, 0)二维
CGFloat zPosition 用来设置CALayer在父层中的位置
以父层的左上角为原点(0)
CGPoint anchorPoint 称为“定位点”、“锚点”
决定着CALayer身上的哪个点会在position属性所指的位置
以自己的左上角为原点(0, 0)
它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
CGFloat anchorPointZ 在3D中在Z中的锚点
BOOL hidden 是否隐藏视图
BOOL masksToBounds 是否切割该视图上面的余下的部分 通常与cornerRadius搭配使用
这么多的属性,一一进行尝试,就会发现其中神奇之处,一些效果在View层面是做不出来的.下面我将介绍几个重要的属性
属性:contents
CALayer 有一个属性叫做contents,这个属性的类型被定义为id,意味着它可以是任何类型的对象。在这种情况下,你可以给contents属性赋任何值。但是,在实践中,如果你给contents赋的不是CGImage,那么你得到的图层将是空白的。
它之所以被定义为id类型,是因为在Mac OS系统上,这个属性对CGImage和NSImage类型的值都起作用。如果你试图在iOS平台上将UIImage的值赋给它,只能得到一个空白的图层。
事实上,你真正要赋值的类型应该是CGImageRef,它是一个指向CGImage结构的指针。UIImage有一个CGImage属性,它返回一个"CGImageRef",如果你想把这个值直接赋值给CALayer的contents,那你将会得到一个编译错误。
尽管Core Foundation类型跟Cocoa对象在运行时貌似很像(被称作toll-free bridging),它们并不是类型兼容的,不过你可以通过bridged关键字转换。如果要给图层的寄宿图赋值,你可以按照以下这个方法:
如果你没有使用ARC,你就不需要__bridge这部分。
让我们来继续修改我们在第一章新建的工程,以便能够展示一张图片而不仅仅是一个背景色。我们已经用代码的方式建立一个图层,那我们就不需要额外的图层了。那么我们就直接把layerView的宿主图层的contents属性设置成图片。
清单2.1 更新后的代码。
网友评论