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-/

原文地址:https://www.cnblogs.com/yangwenhuan/p/9920912.html