Objective-C Core Animation深入理解
Core Animation(核心动画),是从Layer Kit(图层工具包)演变而来的,不仅仅可以用来做动画。
1、视图
一个视图就是屏幕上显示的一个矩形,例如文字、图片和视频。
视图是UIView(NSView)或者其子类,它可以响应鼠标点击和触摸手势等用户操作,可以支持基于Core Graphics绘图,可以做仿射变换,可以做滑动和渐变等动画。
视图可以互相嵌套,形成层级关系树,一个视图可以管理它的子视图。
2、图层
图层就是各种layer,其中最常用的是CALayer。CALayer也是个矩形,可以设置背景色和图片等。同样会形成层级关系树,管理子图层,也可以做变换和动画。不过,CALayer不响应用户的操作。
3、视图和图层的关系
UIView是CALayer的封装。每一个UIView都包含一个CALayer属性,即backing layer(背衬层)。
@property (nullable, strong) CALayer *layer;
视图和图层的层级关系是平行的,真正能在屏幕上显示和做动画的是图层。
4、图层的简单使用
// 创建子图层 CALayer *blueLayer = [CALayer layer]; blueLayer.frame = CGRectMake(50.0f, 50.0f, 100.0f, 100.0f); blueLayer.backgroundColor = [UIColor blueColor].CGColor; // 把子图层加到视图的图层中 [self.view.layer addSublayer:blueLayer];
5、寄宿图
顾名思义,即寄宿在图层中的图。CALayer有个contents属性
/* An object providing the contents of the layer, typically a CGImageRef, * but may be something else. (For example, NSImage objects are * supported on Mac OS X 10.6 and later.) Default value is nil. * Animatable. */ @property(nullable, strong) id contents;
6、自定义绘图
给contents属性赋值不是设置寄宿图的唯一方法,可以通过继承UIView并重写drawRect方法,使用Core Graphics直接绘制寄宿图。
对于UIView,寄宿图不是必须的。但是如果UIView检测到drawRect方法被调用了,就会为视图分配一个寄宿图,这个寄宿图的像素尺寸等于视图大小乘以contentsScale。
https://bihongbo.com/2016/01/03/memoryGhostdrawRect/
If you subclass UIView directly, your implementation of this method does not need to call super.
- (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; // Drawing code here. }
14、图像IO
加载,解码,渲染
图片缓存
离屏渲染
参考链接:
https://zsisme.gitbooks.io/ios-/