美文网首页ios动画
iOS - Core Animation框架学习之CALayer

iOS - Core Animation框架学习之CALayer

作者: 低音区 | 来源:发表于2020-08-13 11:02 被阅读0次

    本来是想在一篇文章中整理一下 Core Animation框架的,才整理完成前三个小模块就好大篇幅了。 草率了~~~还是分开吧。。。
    目的:系统学习Core Animation的构成,和各部分作用。

    首先在iOS中的Core Animation库的组成。

    Core Anmication.png

    目录结构:

    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.png

    Mac OS部分会直接忽略掉。

    1.CALayer

    CALayer:一个对象,该对象管理基于图像的内容,并允许您对该内容执行动画。
    父类:NSObject 协议:CAMediatimingNSSecureCoding

    CALayer架构图.png

    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 FiltersLayer的过滤器

    @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效果图:

    magnificationFilter.png

    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 AnimationsLayer的动画

    - (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 LayerLayer的标识

    @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的篇幅就完成了。整理一遍官方文档,还有一部分知识点了解的不够透彻,持续更新中。请多指教。

    相关文章

      网友评论

        本文标题:iOS - Core Animation框架学习之CALayer

        本文链接:https://www.haomeiwen.com/subject/cicpdktx.html