本来是想在一篇文章中整理一下
Core Animation
框架的,才整理完成前三个小模块就好大篇幅了。 草率了~~~还是分开吧。。。
目的:系统学习Core Animation
的构成,和各部分作用。
首先在iOS中的Core Animation
库的组成。
目录结构:
1. Layer Basics(Layer基础)
2. Text、shapes、and Gradients(文本、形状和渐变)
3.Animation(动画)
4.Animation Group(动画组)
5.Animation Timing(动画时间线)
6. Particle Systems(粒子系统)
7.Advanced Layer Options(高级Layer选项)
8.Metal and OpenGL
9.Managing the Layer’s Transform(Mac OS 适用)
10.Transforms
11.Quartz Composer(已废弃 Mac OS适用)
12.Reference
参考苹果官方的分类方式
下面就开始按序号对应学习了,Mac OS
的会先行忽略掉。
1.Layer Basics
老规矩,先来个一个全部的思维导图:
Layer Basics.pngMac OS部分会直接忽略掉。
1.CALayer
CALayer架构图.pngCALayer:一个对象,该对象管理基于图像的内容,并允许您对该内容执行动画。
父类:NSObject
协议:CAMediatiming
、NSSecureCoding
。
1.1Creating a Layer
创建Layer
的四种方式:
+ layer
- init
- initWithLayer:
+ layerWithRemoteClientId:
1.2Accessing Related Layer Objects
访问相关layer对象
- (instancetype)presentationLayer;
返回表示Layer对象的副本,该对象表示当前在屏幕上显示的Layer的状态。
- (instancetype)modelLayer;
返回与接收者关联的模型层对象(如果有)
1.3Accessing the Delegate
访问代理
@property(nullable, weak) id <CALayerDelegate> delegate;
1.4Providing the Layer’s Content
提供layer的内容
@property(strong) id contents;
提供Layer内容的对象。
@property CGRect contentsRect;
单位坐标空间中的矩形,用于定义应使用的Layer内容部分。
@property CGRect contentsCenter;
矩形,用于定义在调整Layer内容大小时如何缩放Layer内容。
- (void)display;
重新加载该层的内容。
- (void)drawInContext:(CGContextRef)ctx;
使用指定的图形上下文绘制Layer的内容。
1.5Modifying the Layer’s Appearance
修改Layer的外观
@property(copy) CALayerContentsGravity contentsGravity;
一个常数,指定Layer内容如何在其边界内定位或缩放。当层边界大于内容对象的边界时,内容重力常数指定内容对象的位置。它们由contentsGravity
属性使用。
CALayerContentsGravity:
kCAGravityCenter
内容在边界矩形中水平和垂直居中。kCAGravityTop
内容在边界矩形的上边缘水平居中。kCAGravityBottom
内容在边界矩形的下边缘水平居中。kCAGravityLeft
内容在边界矩形的左边缘垂直居中。kCAGravityRight
内容在边界矩形的右边缘垂直居中。kCAGravityTopLeft
内容位于边界矩形的左上角。kCAGravityTopRight
内容位于边界矩形的右上角。kCAGravityBottomLeft
内容位于边界矩形的左下角。kCAGravityBottomRight
内容位于边界矩形的右下角。kCAGravityResize
调整内容大小以适合整个边界矩形。kCAGravityResizeAspect
调整内容大小以适合边界矩形,从而保留内容的外观。如果内容没有完全填充边界矩形,则内容将以部分轴为中心。kCAGravityResizeAspectFill
调整内容大小以完全填充边界矩形,同时仍保留内容的外观。内容以其超过的轴为中心。
opacity:
接收者的不透明度。
hidden:
指示是否显示Layer的布尔值。
masksToBounds:
一个布尔值,指示是否将子层裁剪到该层的边界。
mask:
可选Layer,其Alpha通道用于掩盖Layer的内容。
doubleSided:
一个布尔值,指示当背离查看器时,Layer是否显示其内容。
cornerRadius:
绘制Layer背景的圆角时使用的半径。
maskedCorners:
CACornerMask:
borderWidth:
Layer边框的宽度。
borderColor:
Layer边框的背景色。
backgroundColor:
接收器的背景色。
shadowOpacity:
Layer阴影的不透明度。
shadowRadius:
用于渲染Layer阴影的模糊半径(以磅为单位)。
shadowOffset:
Layer阴影的偏移量(以磅为单位)。
shadowColor:
Layer阴影的形状。
shadowPath:
Layer阴影的形状。
style:
可选字典,用于存储未由Layer明确定义的属性值。
allowsEdgeAntialiasing:
allowsGroupOpacity:
1.6Layer Filters
Layer的过滤器
@property(copy) NSArray *filters;
一组核心图像过滤器,可应用于Layer及其子Layer的内容。
@property(strong) id compositingFilter;
一个CoreImage滤镜,用于合成Layer及其背后的内容。
@property(copy) NSArray *backgroundFilters;
一组Core Image滤镜,可直接应用于Layer后面的内容。
@property(copy) CALayerContentsFilter minificationFilter;
减小内容大小时使用的过滤器。
@property float minificationFilterBias;
缩小过滤器用来确定详细程度的偏差因子。
@property(copy) CALayerContentsFilter magnificationFilter;
增加内容大小时使用的过滤器。
magnificationFilter
效果图:
1.7Configuring the Layer’s Rendering Behavior
配置layer的渲染行为
@property(getter=isOpaque) BOOL opaque;
一个布尔值,指示该Layer是否包含完全不透明的内容。
@property CAEdgeAntialiasingMask edgeAntialiasingMask;
定义如何光栅化接收器边缘的位掩码。
- (BOOL)contentsAreFlipped;
返回一个布尔值,指示在渲染时是否隐式翻转Layer内容。
@property(getter=isGeometryFlipped) BOOL geometryFlipped;
一个布尔值,指示该层及其子层的几何形状是否垂直翻转。
@property BOOL drawsAsynchronously;
一个布尔值,指示是否在后台线程中延迟和异步处理绘图命令。
@property BOOL shouldRasterize;
一个布尔值,指示在合成之前是否将Layer渲染为位图。
@property CGFloat rasterizationScale;
相对于Layer的坐标空间栅格化内容的比例。
@property(copy) CALayerContentsFormat contentsFormat;
有关所需的Layer内容存储格式的提示。
- (void)renderInContext:(CGContextRef)ctx;
将Layer及其子Layer渲染到指定的上下文中。
1.8Modifying the Layer Geometry
修改Layer的几何形状
@property CGRect frame;
Layer的框架矩形。
@property CGRect bounds;
Layer的边界矩形。
@property CGPoint position;
Layer在其上层坐标空间中的位置。
@property CGFloat zPosition;
Layer在z轴上的位置。
@property CGFloat anchorPointZ;
Layer沿z轴位置的锚点。
@property CGPoint anchorPoint;
定义Layer边界矩形的锚点。
@property CGFloat contentsScale;
应用于Layer的比例因子。
1.9Managing the Layer’s Transform
管理Layer的转换
@property CATransform3D transform;
转换应用于Layer的内容。
@property CATransform3D sublayerTransform;
指定在渲染时应用于子层的变换。
- (CGAffineTransform)affineTransform;
返回Layer变换的仿射版本。
- (void)setAffineTransform:(CGAffineTransform)m;
将Layer的变换设置为指定的仿射变换。
1.10 Managing the Layer Hierarchy
管理Layer层次结构
@property(copy) NSArray<__kindof CALayer *> *sublayers;
包含该层子层的数组。
@property(readonly) CALayer *superlayer;
父类Layer。
- (void)addSublayer:(CALayer *)layer;
将Layer添加到Layer的子Layer列表中。
- (void)removeFromSuperlayer;
从其父层分离该层。
- (void)insertSublayer:(CALayer *)layer atIndex:(unsigned int)idx;
将指定的Layer插入到指定索引处的接收者的子Layer列表中。
- (void)insertSublayer:(CALayer *)layer below:(CALayer *)sibling;
将指定的子层插入到已经属于接收方的另一个子层下。
- (void)insertSublayer:(CALayer *)layer above:(CALayer *)sibling;
将指定的子层插入到已经属于接收方的另一个子层之上。
- (void)replaceSublayer:(CALayer *)oldLayer with:(CALayer *)newLayer;
将指定的子Layer替换为其他Layer对象。
1.11 Updating Layer Display
更新Layer显示
- (void)setNeedsDisplay;
将Layer的内容标记为需要更新。
- (void)setNeedsDisplayInRect:(CGRect)r;
将指定矩形内的区域标记为需要更新。
@property BOOL needsDisplayOnBoundsChange;
如果Layer当前被标记为需要更新,则启动该Layer的更新过程。
- (void)displayIfNeeded;
如果Layer当前被标记为需要更新,则启动该Layer的更新过程。
- (BOOL)needsDisplay;
返回一个布尔值,指示该Layer是否已标记为需要更新。
+ (BOOL)needsDisplayForKey:(NSString *)key;
返回一个布尔值,指示对指定键的更改是否需要重新显示该Layer。
1.12 Layer Animations
Layer的动画
- (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key;
将指定的动画对象添加到Layer的渲染树。
- (__kindof CAAnimation *)animationForKey:(NSString *)key;
返回具有指定标识符的动画对象。
- (void)removeAllAnimations;
删除所有附加到该Layer的动画。
- (void)removeAnimationForKey:(NSString *)key;
使用指定的关键帧删除动画对象。
- (NSArray<NSString *> *)animationKeys;
返回一个字符串数组,该字符串标识当前附加到该Layer的动画。
1.13 Managing Layer Resizing and Layout
管理Layer大小调整和布局
@property(strong) id<CALayoutManager> layoutManager;
负责布置Layer的子Layer的对象。
- (void)setNeedsLayout;
使Layer的布局无效并将其标记为需要更新。
- (void)layoutSublayers;
告诉Layer更新其布局。
- (void)layoutIfNeeded;
如果需要,请重新计算接收器的布局。
- (BOOL)needsLayout;
返回一个布尔值,指示是否已将Layer标记为需要布局更新。
- (void)resizeWithOldSuperlayerSize:(CGSize)size;
- (void)resizeSublayersWithOldSize:(CGSize)size;
- (CGSize)preferredFrameSize;
1.14 Managing Layer Constraints
管理Layer约束
此模块适用于Mac OS 系统。忽略
1.15 Getting the Layer’s Actions
获取Layer的动作
- (id<CAAction>)actionForKey:(NSString *)event;
返回分配给指定键的操作对象。
@property(copy) NSDictionary<NSString *,id<CAAction>> *actions;
一个包含Layer动作的字典。
+ (id<CAAction>)defaultActionForKey:(NSString *)event;
返回当前类的默认操作。
1.16 Mapping Between Coordinate and Time Spaces
坐标和时间空间之间的映射
查了一些资料,还是不太明白。慢慢在找,TODO:mark一下,持续了解
- (CGPoint)convertPoint:(CGPoint)p fromLayer:(CALayer *)l;
将点从指定Layer的坐标系转换为接收者的坐标系。
- (CGPoint)convertPoint:(CGPoint)p toLayer:(CALayer *)l;
将点从接收者的坐标系转换为指定Layer的坐标系。
- (CGRect)convertRect:(CGRect)r fromLayer:(CALayer *)l;
将矩形从指定Layer的坐标系转换为接收者的坐标系。
- (CGRect)convertRect:(CGRect)r toLayer:(CALayer *)l;
将矩形从接收者的坐标系转换为指定Layer的坐标系。
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l;
将时间间隔从指定层的时间空间转换为接收者的时间空间。
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l;
将时间间隔从接收者的时间空间转换为指定层的时间空间
1.17 Hit Testing
- (__kindof CALayer *)hitTest:(CGPoint)p;
返回包含指定点的Layer层次结构中接收者的最远后裔(包括自身)修改点击区域使用
- (BOOL)containsPoint:(CGPoint)p;
返回接收方是否包含指定点。
1.18 Scrolling
滚动
@property(readonly) CGRect visibleRect;
Layer在其自己的坐标空间中的可见区域。
- (void)scrollPoint:(CGPoint)p;
在该层的最接近的父滚动层中启动滚动,以使指定点位于滚动层的原点。p:当前Layer中应滚动到位置的点。
- (void)scrollRectToVisible:(CGRect)r;
在该层的最接近的父滚动层中启动滚动,以使指定的矩形变为可见。r:要显示的矩形。
1.19 Identifying the Layer
Layer的标识
@property(copy) NSString *name;
接收者的名字。
TODO:`name`打印为`null`
NSLog(@"layer's name:%@", self.view.layer.name);
1.20 Key-Value Coding Extensions
键值编码扩展
- (BOOL)shouldArchiveValueForKey:(NSString *)key;
由对象的实现-encodeWithCoder:调用,返回false,如果命名的属性不应该被存档。基地实现返回YES。子类应该调用super for未知属性。
+ (id)defaultValueForKey:(NSString *)key;
CALayer实现了标准的NSKeyValueCoding协议由类及其子类定义的属性。它动态实现属性缺少的访问器方法宣布子类。当通过KVC访问值不是象的属性时,使用了标准的KVC包装约定,并扩展到支持以下类型:
C类型类
CGPoint NSValue
CGSize NSValue
CGRect中NSValue
CGAffineTransform NSValue
CATransform3D NSValue * /
返回指定属性的默认值,如果没有,则返回nil
默认值是已知的。重写此方法的子类
为自己的属性定义默认值应该调用“super”
对未知的属性。
1.21Constants
常量
CAEdgeAntialiasingMask
edgeAntialiasingMask属性使用此蒙版。
CATransform3D:
//整个Core Animation中使用的标准转换矩阵。/*Homogeneous three-dimensional transforms. */ struct CATransform3D { CGFloat m11, m12, m13, m14; CGFloat m21, m22, m23, m24; CGFloat m31, m32, m33, m34; CGFloat m41, m42, m43, m44; }; typedef struct CA_BOXABLE CATransform3D CATransform3D;
1.22Instance Properties
实例属性 (iOS 13.0
开始支持)
@property(copy) CALayerCornerCurve cornerCurve;
定义用于渲染Layer圆角的曲线。默认为“kCACornerCurveCircular”。
+ (CGFloat)cornerCurveExpansionFactor:(CALayerCornerCurve)curve;
适用于圆角边框大小的扩展比例因子,当使用特定的转角曲线时。
CALayer篇章完成
2.CALayerDelegate
CALayerDelegate
:您的应用可以实现的方法,以响应与图层相关的事件
//告诉delegate实施显示过程。
- (void)displayLayer:(CALayer *)layer;
//告诉delegate使用图层的CGContextRef来实现显示过程。
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;
//绘制即将开始
- (void)layerWillDraw:(CALayer *)layer;
//告诉delegate图层的边界已更改。
- (void)layoutSublayersOfLayer:(CALayer *)layer;
//返回actionForKey:方法的默认操作。
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event;
3.CAAction协议
CAAction
:一个允许对象响应CALayer更改触发的动作的接口
/*调用它来触发接收器上名为“path”的事件。的对象
*(例如,事件发生的层)是“一个对象”。的
*参数字典可能是nil,如果非nil它携带参数
*与事件相关。* /
- (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(nullable NSDictionary *)dict;
至此有关Core Animation框架中CALayer的篇幅就完成了。整理一遍官方文档,还有一部分知识点了解的不够透彻,持续更新中。请多指教。
网友评论