Layers and Views
如果你开发过iOS或者Mac OS里面的软件,你肯定熟悉视图这个概念。视图是显示内容的(如图像,文本或视频)的举行对象,用来获取用户的行为,比如:鼠标点击或者触摸手势。
在iOS系统中,所有的views都继承自基类:UIView。UIView控制触摸事件,支持Core Graphics为基础的图绘制,以及基本的图形的变换(例如:旋转和缩小),以及简单的动画,比如:滑动和褪色。
也许你不知道,UIView在大部分的情况下,并不处理工作本身,渲染,布局和动画都是由一个叫:CALayer的核心动画类管理的。
CALayer
CALayer类从概念概念上和UIView表类似,都可以包含内容(比如图像,文本或者颜色)并管理他们的子层的的位置,并且由用于执行动画和旋转的方法和属性。CALayer并不是UIView唯一能够能够处理用户交互的方式。
因为CALayer并没有响应链,所以因此不能对事件做出响应。(即iOS用来获取触摸图层事件的机制),虽然它确实提供了一些方法来帮助去定一个特定的接触点是否在这个层的范围内。
Parallel Hierachies
每一个UIView都有一个layer属性,它是CALayer的实例。这就是我们所知道的背景层,这个视图负责创建和管理这一层,并确保当子视图添加或者他们的相应的背景层移除。
它实际上这些支持层是负责你在屏幕上显示的东西。UIView是一个简单的包装,它提供iOS的特有的功能,比如触摸动作和为低级的核心动画提供高级的接口。
那么,会什么iOS有UIView和CALayer这两个平行层次?为什么不能够处理所有的但层次?主要是因为这样的分离有利于避免代码的重复,尤其是在iOS和OSX平台上面,iOS上有点击手势,多点触控而OSX上面还有鼠标和键盘,所以iOS 有UIKit和UIView而OSX有AppKit和NSView,它们功能上相似,但是使用效果却不经相同。
绘画,布局和动画同样使用于类似iPhone或者iPad这样的触摸屏,毕竟它们是笔记本电脑和台式电脑的远房亲戚,苹果公司通过从OSX系统中分离出来的逻辑集成到独立的Core Animation这个框架中,使得不管是苹果公司还是第三方开发者,都能过简单通过针对不同的平台而选择相应的框架 。
事实上,这里有四个这样的层次,分别执行不同的角色,除了视图层次结构还有Layer tree,presetation tree和render tree。
Layer Capabilities
那么这里不禁要问,既然CALayer是UIView内部工作的具体实现细节,那么为什么我们要了解它呢,当然,苹果处理的比较好,所以在简单的使用我们不需要直接于使用Core Animation。
在某种程度上,为了简单起见我们不需要去利用CALayer去处理,因为苹果公司已经允许通过高级API去调用UIView里的强大功能。但是简单一定为带来某些问题,比如灵活性的丧失,如果你想稍微的与众不同,或者使用某种功能,但是,苹果并没有提供相应的UIView类的接口,那么你别无选择,你只能冒险去核心动画的底层去用Lower-level选型。
那么我们看看有什么Layer可以完成,但是 UIView不能完成的效果:
1.阴影,圆角和边框色
2.3D旋转和定位
3.非矩形边界
4.颜色自选
5.多步,非线性动画
那么接下来,我们看看如何让CALayer在一个应用程序中使用。
Working with Layers
首先选择 Single View Application template创建应用程序,然后在屏幕中央创建一个大概200*200的视图。这里使用Interface Builder创建视图,那么你看到的小视图就是Layer View。
如果你运行程序,你会看到一个白色的方形的浅灰色背景的中间 。如果你没有看到这一点,你可能需要调整窗口/视图的背景颜色。
接下来,让我们改变一下视图,首先在应用中添加QuartzCore框架,然后在视图控制器.m文件中导入<QuartzCore/QuartzCore.h>。
这样我们就能直接调用CALayer和它的属性,接下来设置CALayer层的background属性,然后将其作为LayerView的Backing Layer(这里都是假设你是用Interface Build去创建应用程序的)。接下来就是代码说话:
Listing 1.1 Adding a Blue Sublayer to the View#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
@interface ViewController ()
@property (nonatomic, weak) IBOutlet UIView *layerView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//create sublayer
CALayer *blueLayer = [CALayer layer];
blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f); blueLayer.backgroundColor = [UIColor blueColor].CGColor;
//add it to our view
[self.layerView.layer addSublayer:blueLayer]; }
@end
你就会看到不同,因为时间关系我不想贴图了。
一个视图只有一个backing layer(自动创建的),但是可以创建任意数量的additional layer,并且可以将其看作为一个视图的backing layer的子层。通过这种创建方式,你就不需要再创建额外的托管层了。除了极个别的情况需要添加,这里就不再赘述了!