iOS动画

CALayer

2017-02-16  本文已影响0人  玄裳

CALayer类


CALayer 是一个管理基于图像的内容,并允许执行动画内容的类。

** CALayer : NSObject <NSCoding, CAMediaTiming>**

CALayer 继承于 NSObject遵循 NSCodingCAMediaTiming 协议,通常用于提供视图的后背存储,但也可以在不显示内容的情况下使用。

CALayer 的主要工作是管理提供的可视内容,提供可设置的可视属性,例如backgroundColorbordershadow

除了管理可视内容之外,CALayer 还可以维护在屏幕上呈现该内容的几何形状的信息,比如 positionsizetransform等。

采用CAMediaTiming 协议来封装图层及其动画持续的时间和节奏,CAMediaTiming 协议定义了图层的定时信息。

如果图层对象时由view 创建的,则view 会自动将自身指定为layerdelegate

对于自定义创建的图层,可以分配 delegate 对象,并使用该对象动态提供图层的内容并执行其他任务。

图层还可以具有布局管理对象(分配给layoutManager属性)以layoutManager管理子视图的布局。

接口


创建Layer

** +( instancetype ) layer ;**
如果你子类化CALayer ,你可以重写这个方法,并使用它来提供你的特定子类的实例。

** - ( instancetype ) init ;**
不指定图层对象的初始值。

** - ( instancetype ) initWithLayer: ( id ) layer ;**
复制自定义的图层。

访问相关图层对象

** - ( instancetype ) presentationLayer ;**
返回表示图层对象的副本,表示当前在屏幕上显示的图层的状态。提供了当前正在屏幕上显示的图层的近似值。 动画正在进行时,可以检索此对象,并使用它来获取这些动画的当前值。

** - ( instancetype ) modelLayer ;**
在呈现树中的图层上调用此方法会返回模型树中的相应图层对象。 只有当涉及表示层更改的事务正在进行时,此方法才返回值。 如果没有事务正在进行,则调用此方法没什么意义。

访问delegate

** @property(weak)id <CALayerDelegate> delegate;**

提供图层的内容

** @property(strong)id contents;**
此属性的默认值为nil,如果使用图层显示静态图像,可以设值为 CGImageRef 对象 。 (在macOS 10.6以上版本中,可将属性设置为 NSImage 对象。)若需要交互,则避免设置此属性的内容。

** @property CGRect contentsRect;**
默认为单位矩形(0.0,0.0,1.0,1.0)
如果请求单位矩形外的像素,则内容图像的边缘像素将向外扩展。

** @property CGRect contentsCenter;**
默认值为单位矩形(0.0,0.0) (1.0,1.0) ,整个图像在两个维度上缩放。 如果图层内容调整大小时如何缩放图层内容的矩形。

** - ( void ) display ;**
重新加载图层的内容。不要直接调用,如果图层有委托对象,尝试调用委托的>displayLayer:方法来更新图层的内容。 如果委托没有实现displayLayer:方法,此方法将创建一个后台存储,并调用图层的drawInContext:方法来使用内容填充后台存储。 新的后备存储将替换该层的先前内容。

** - ( void ) drawInContext: ( CGContextRef ) ctx ;**
使用指定的图形上下文绘制图层的内容。默认实现本身不会执行任何绘图。 如果图层的委托实现了drawLayer:inContext:方法,那么调用该方法来执行实际绘图。

修改图层的外观

** @property(copy) NSString *contentsGravity;**
默认值为kCAGravityResize
内容的命名重力常数是基于垂直轴的方向。 如果你使用垂直分量的重力常数,例如kCAGravityTop ,你也应该检查图层的contentsAreFlipped(图层内容在呈现时是否隐式翻转)。 当这是YES时,kCAGravityTop将内容对齐到图层的底部,而kCAGravityBottom将内容对齐到图层的顶部。

MacOSiOS中视图的默认坐标系统在垂直轴的方向上不同:在 macOS中,默认坐标系的原点位于绘图区域的左下角,正值从中向上延伸,在 iOS 中,默认坐标系默认坐标系的原点在绘图区域的左上角,正值从它向下延伸。

设置图层内容重力的不同效果.png

图1. 内容重力是kCAGravityResize - 默认值
图2. 内容重力是kCAGravityCenter
图3. 内容重力是contentsAreFlipped ? kCAGravityTop : kCAGravityBottom
图4. 内容重力是contentsAreFlipped ? kCAGravityBottomLeft : kCAGravityTopLeft

** @property float opacity;**
透明度,设值必须在0.0(透明)到1.0 (不透明)的范围内。

** @property(getter=isHidden) BOOL hidden;**
隐藏该图层,默认值为NO

** @property BOOL masksToBounds;**
默认值为NO 。当此属性的值为YES时,Core Animation将创建与图层边界匹配的隐式裁剪蒙版,并包括任何角半径效果。 如果还指定了mask 属性的值,则将这两个掩码相乘以获得最终掩码值。

** @property(strong) CALayer *mask;**
默认值为 nil 。图层的 Alpha 通道决定图层内容和背景显示的内容。 完全或部分不透明像素允许基础内容通过但完全透明像素显示内容。

** @property(getter=isDoubleSided) BOOL doubleSided;**
默认值为YES 。设为YES时,图层旋转至其背面会显示镜像的图像,设为NO 时,则不会显示背面。但背面隐藏的视图仍然会响应点击事件(这和通过设置hidden 属性或者设置alpha0而隐藏的视图不同,那两种方式将不会响应事件)

** @property CGFloat cornerRadius;**
用于绘制图层圆角。 默认情况下,角半径不适用于图层的contents属性中的图像; 它仅适用于图层的背景颜色和边框。 但是,将masksToBounds属性设置为YES会导致内容被剪切到圆角。

** @property CGFloat borderWidth;**
图层边框。

** @property CGColorRef borderColor;**
图层边框的颜色。

** @property CGColorRef backgroundColor;**
图层的背景颜色。

** @property float shadowOpacity;**
图层的阴影不透明度,设值必须在0.0(透明)到1.0(不透明)的范围内。

** @property CGFloat shadowRadius;**
图层阴影的圆角。

** @property CGSize shadowOffset;**
图层阴影的偏移量。

** @property CGColorRef shadowColor;**
图层的阴影颜色。

** @property CGPathRef shadowPath;**
图层的阴影的路径/形状。

** @property(copy) NSDictionary *style;**
存储没有被图层显式定义的属性值的可选字典。

该字典可以进一层具有 style 键,形成默认值的层次结构。 在分层样式字典的情况下,使用属性的最浅的值。 例如,“style.someValue” 的值优先于 “style.style.someValue”。如果样式字典未定义属性的值,则调用接收器的 defaultValueForKey: 方法。 此属性的默认值为nil

** @property BOOL allowsEdgeAntialiasing;**
指示是否允许图层执行边缘抗锯齿的布尔值。
当值为YES时,允许图层根据图层的edgeAntialiasingMask属性中的值要求(顶部,左侧,底部,右侧),对其边缘进行抗锯齿处理。 默认值从main bundleInfo.plist 文件中的布尔UIViewEdgeAntialiasing 属性读取。 如果未找到任何值,则默认值为NO

** @property BOOL allowsGroupOpacity;**
图层是否允许将其自身组合为与其父级独立分开的组。即各图层的透明效果是独立的。
当值为 YES 并且图层的 opacity 属性值小于 1.0 时,图层允许将其自身复合为与其父级分离的组。 当图层包含多个不透明组件时,这会产生正确的结果,但可能会降低性能。
默认值从main bundleInfo.plist 文件中的布尔值UIViewGroupOpacity 属性读取。 如果未找到值,则针对iOS 7 SDK 或更高版本链接的应用程序的默认值为YES ,对于使用较早版本的SDK 链接的应用程序则为默认值。

访问图层的滤镜

** @property(copy) NSArray *filters;**
默认值为nil 。图层及其子图层内容的 Core Image 滤镜数组。
添加到此属性的滤镜会影响图层的内容,包括其边框,已填充的背景和子图层。
CIFilter对象附加到图层后直接更改其输入会导致未定义的行为。 可以在将滤镜参数附加到图层后修改滤镜参数,但是必须使用图层的setValue:forKeyPath:方法才能这样做。必须为滤镜分配名称,以便可以在数组中标识它。 例如,要更改滤镜的inputRadius参数,可以使用类似于以下代码:
CIFilter *filter = ...; CALayer *layer = ...; filter.name = @"myFilter"; layer.filters = [NSArray arrayWithObject:filter]; [layer setValue:[NSNumber numberWithInt:1] forKeyPath:@"filters.myFilter.inputRadius"];

** @property(strong) id compositingFilter;**
默认值为nil ,会导致图层使用源过度合成。 推荐使用CICategoryCompositeOperation类别中的内容。

** @property(copy) NSArray *backgroundFilters;**
默认值为nil。背景滤镜影响在图层本身中显示的图层后面的内容。 通常,此内容属于作为图层父级的上层。 这些滤镜不会影响图层本身的内容,包括图层的背景颜色和边框。可使用图层的masksToBounds来控制其背景滤镜效果的程度。

** @property(copy) NSString *minificationFilter;**
减少内容大小时使用的滤镜, 默认值为kCAFilterLinear 。使用到的枚举常量:

** @property float minificationFilterBias;**
缩小滤镜用于确定细节水平的偏差因子。当minificationFilter设置为kCAFilterTrilinear时,将使用此值。默认值为0.0

** @property(copy) NSString *magnificationFilter;**
当增加内容的大小时使用的过滤器。默认值为kCAFilterLinear

左边的圆圈使用kCAFilterLinear ,右边的圆圈使用kCAFilterNearest .png
配置图层的显示行为

** @property(getter=isOpaque) BOOL opaque;**
默认值为NO 。 如果绘制完全不透明的内容填充图层的边界,设值为YES可以让系统优化图层的显示行为。当图层为绘图命令创建后备存储时,Core Animation 会省略后备存储的Alpha通道。 这样做可以提高合成操作的性能。** 如果设为YES时 ,则必须使用不透明内容填充图层的边界。**
设置此属性仅影响由Core Animation管理的后备存储。 如果图层的contents属性指定带有Alpha通道的图片,则该图片会保留其Alpha通道,无论此属性的值如何。

** @property CAEdgeAntialiasingMask edgeAntialiasingMask;**
指定图层的哪些边被抗锯齿,并且是CAEdgeAntialiasingMask中定义的CAEdgeAntialiasingMask。 可以分别为每个边缘(顶部,左侧,底部,右侧)启用或禁用抗锯齿。 默认情况下,对所有边都启用抗锯齿。使用该属性来为邻接其他图层边缘的边缘禁用抗锯齿,以消除否则会发生的接缝。定义使用下面的常量:

** - (BOOL)contentsAreFlipped;**
默认返回 NO ,图层内容在呈现时是否隐式翻转。如果图层需要翻转其内容,则从此方法返回YES ,并将y-flip变换应用于图形上下文,然后将其传递给图层的drawInContext:方法。 类似地,图层将传递给其setNeedsDisplayInRect:任何矩形转换为翻转的坐标空间。

** @property(getter=isGeometryFlipped) BOOL geometryFlipped;**
默认值为NO ,图层及其子图层的几何是否垂直翻转。

** @property BOOL drawsAsynchronously;**
默认值为NO,设置为YES 时,用于绘制图层内容队列的图形上下文绘制命令,并在后台线程上执行它们,而不是同步执行它们。 以异步方式执行这些命令可以提高某些应用程序的性能。 但是,在启用此功能之前,应始终衡量实际的性能优势。

** @property BOOL shouldRasterize;**
默认值为NO,图层是否在合成之前作为位图呈现。当设成YES时,layer 被渲染成一个位图,并缓存起来,等下次使用时不会再重新去渲染了。实现圆角本身就是在做颜色混合(blending),如果每次页面出来时都合成,消耗太大,这时shouldRasterize = YES,下次就只是简单的从渲染引擎的cache 里读取那张位图,节约系统资源。
如果在滚动tableView时,每次都执行圆角设置,肯定会阻塞UI,设置这个将会使滑动更加流畅。

** @property CGFloat rasterizationScale;**
默认值为1.0 ,表示图层应按当前大小进行栅格化。当 shouldRasterize 属性中的值为 YES 时,图层将使用此属性来确定是否缩放栅格化内容(以及多少)。 较大的值放大内容,较小的值收缩它。

** @property(copy)NSString * contentsFormat;**
图层内容的所需存储格式,默认值为kCAContentsFormatRGBA8UintUIView 和基于图层的 NSView 对象可以将值更改为适合当前设备的格式。

** - (void)renderInContext:(CGContextRef)ctx;**
将图层及其子图层渲染​​到指定的上下文中。

修改图层几何

** @property CGRect frame;**
图层的框架矩形,相对于父视图中的坐标。frame 属性不是直接可动的。

** @property CGRect bounds;**

图层的边界矩形,相对于自身的坐标。

** @property CGPoint position;**
以点为单位指定,并始终相对于anchorPoint 属性中的值指定。 对于新的独立图层,默认位置设置为(0.0,0.0)。 更改frame 属性还会更新此属性中的值。

** @property CGFloat zPosition;**

图层在z轴上的位置,默认值为0。 更改此属性的值会更改屏幕上图层的从前到后的顺序。 较高的值观看者越容易看到。 这可能影响其框架矩形重叠的图层的可见性。

** @property CGFloat anchorPointZ;**
默认值为0 ,指定 z 轴上的定位点,围绕其发生几何操作。 该点表示为沿着 z 轴的距离(以点为单位测量)。

** @property CGPoint anchorPoint;**
定义图层边界矩形的定位点,使用单位坐标空间指定此属性的值。 默认值为(0.5,0.5),它表示图层的边界矩形的中心。 视图的所有几何操作都发生在指定点。 例如,对具有默认锚点的图层应用旋转变换会导致图层绕其中心旋转。 将锚点更改为不同的位置将导致图层围绕该新点旋转。

** @property CGFloat contentsScale;**
图层内容的比例, 例如,若比例值为2.0 ,并且图层的边界为50 x 50点,则用于显示图层内容的位图的大小为100 x 100像素。默认值为1.0。 对于附加到视图的图层,视图会将缩放比例自动更改为适合当前屏幕的值。 对于自己创建和管理的图层,必须根据屏幕的分辨率和您提供的内容自行设置此属性的值。

** @property CATransform3D transform;**
图层围绕锚点做几何变换。

** @property CATransform3D sublayerTransform;**
子图层围绕锚点做几何变换。

** - (CGAffineTransform)affineTransform;**
与图层transform属性中的值对应的仿射变换结构。

** - (void)setAffineTransform:(CGAffineTransform)m;**
将图层的变换设置为指定的仿射变换。

** @property(copy) NSArray<CALayer *> *sublayers;**

包含子图层的数组。当将sublayers 属性设置为用图层对象填充的数组时,数组中的每个图层都不能有一个 superlayer,也就是说,它的superlayer 属性必须为nil

** @property(readonly)CALayer * superlayer;**
父图层。

** - (void)addSublayer:(CALayer *)layer;**
添加子图层。

** - (void)removeFromSuperlayer;**
从父图层中移除图层。

** - (void)insertSublayer:(CALayer *)layer atIndex:(unsigned int)idx;**
把指定的图层插入指定索引处的 sublayers 数组中。

** - (void)insertSublayer:(CALayer *)layer below:(CALayer *)sibling;**
在当前现有的子图层下面插入指定的子图层。

** - (void)insertSublayer:(CALayer *)layer above:(CALayer *)sibling;**
在当前现有的子图层上面插入指定的子图层。

** - (void)replaceSublayer:(CALayer *)layer with:(CALayer *)layer2;**
替换现有的旧子图层,使用指定的新子图层。

更新图层显示

** - (void)setNeedsDisplay;**

将图层的内容标记为需要更新。调用此方法将导致图层重新缓存其内容。 这导致该图层可能调用其代理的 displayLayer:drawLayer:inContext: 方法。 将删除图层的 contents 属性中的现有内容,以便为新内容腾出空间。

** - (void)setNeedsDisplayInRect:(CGRect)r;**
将指定矩形内的区域内容标记为需要更新。

** @property BOOL needsDisplayOnBoundsChange;**
默认值为 NO ,设置为YES时,每当其 bounds 属性更改时,图层将自动调用其 setNeedsDisplay 方法。

** - (void)displayIfNeeded;**
如果图层当前被标记为需要更新,则启动图层的更新过程。您可以根据需要调用此方法,以强制在正常更新周期之外更新您的图层内容。更新图层的首选方法是调用setNeedsDisplay 并让系统在下一个周期内更新图层。

** - (BOOL)needsDisplay;**
如果图层需要更新,则为YES

** + (BOOL)needsDisplayForKey:(NSString *)key;**
默认实现返回 NO ,如果图层需要重新显示,则为YES

图层动画

** - (void)addAnimation:(CAAnimation *)anim forKey:(NSString *)key;**、
将指定的动画对象添加到图层的渲染树。

** - (CAAnimation *)animationForKey:(NSString *)key;**
返回具有指定标识符的动画对象。

** - (void)removeAllAnimations;**
移除附加在图层上的所有动画。

** - (void)removeAnimationForKey:(NSString *)key;**

移除附加在图层上的所有动画。

** - (NSArray<NSString *> *)animationKeys;**
返回一个字符串数组,用于标识当前附加到图层的动画。数组的顺序与动画应用于图层的顺序相匹配。

管理图层调整大小和布局

** @property(strong) id<CALayoutManager> layoutManager;**
负责布局子图层的对象。分配给此属性的对象必须名义上实现 CALayoutManager 非正式协议。 如果图层的委托不处理布局更新,则赋予此属性的对象有机会更新图层子图层的布局。

** - (void)setNeedsLayout;**
使图层的布局无效,并将其标记为需要更新。通常在图层的界限改变时或在添加或删除子层时自动调用此方法。

** - (void)layoutSublayers;**
图层更新其布局。默认实现调用图层的委托对象的 layoutSublayersOfLayer: 方法。 如果没有委托对象,或者委托没有实现该方法,则此方法将调用 layoutManager属性中对象的layoutSublayersOfLayer: 方法。

** - (void)layoutIfNeeded;**
如果需要,重新计算图层的布局。遍历图层的上层,直到找到不需要布局的元类层。 然后在该元类下的整个图层树上执行布局。

** - (BOOL)needsLayout;**
图层是否已标记为需要布局更新。

** @property CAAutoresizingMask autoresizingMask;**
用于定义当其上层的边界发生变化时如何调整图层的大小。

** - (void)resizeWithOldSuperlayerSize:(CGSize)size;**
通知接收器其父层的大小改变了。当autoresizingMask属性用于调整大小和图层更改的边界时,该图层将在其每个子图层上调用此方法。 子图层调整自己的框架矩形以反映新的父层边界,可以直接从父层检索。 将父层的旧大小作为参数传递,以便子层具有用于其必须进行的任何计算的信息。

** - (void)resizeSublayersWithOldSize:(CGSize)size;**
通知接收器的子层,接收器的大小已经改变。当 autoresizingMask 属性用于调整大小并且此图层的边界更改时,将调用此方法。 默认实现调用每个子图层的 resizeWithOldSuperlayerSize: 方法,让它知道它的父层的边界改变了。

** - (CGSize)preferredFrameSize;**
图层在其父层的坐标空间中的预设大小。

管理图层约束

** @property(copy) NSArray<CAConstraint *> *constraints;**
用于定位当前图层的子图层的约束

** - (void)addConstraint:(CAConstraint *)c;**
将指定的约束添加到图层。

获取图层的操作

** - (id<CAAction>)actionForKey:(NSString *)event;**
搜索图层的给定操作对象。 操作定义图层的动态行为。
例如,图层的可动画属性通常具有相应的动作对象以启动实际动画。 当该属性更改时,图层将查找与属性名称关联的操作对象并执行它。 还可以将自定义操作对象与图层相关联,以实现特定于应用程序的操作。
按以下顺序搜索layer的关联操作:

  1. 如果图层具有实现actionForLayer:forKey:方法的委托,则图层将调用该方法。 代理必须执行以下操作之一:
  1. 该图层在图层的actions字典中查找匹配的键/操作对。
  2. 该层在style字典中查找匹配键/操作对的actions字典。
  3. 图层调用defaultActionForKey: class方法来查找任何类定义的操作。
    如果任何上述步骤返回NSNull的实例,则在继续之前将其转换为nil
    当调用动作对象时,它接收三个参数:事件的名称,事件发生的对象(layer),以及每个事件类型特定的命名参数的字典。

** @property(copy) NSDictionary<NSString *,id<CAAction>> *actions;**
默认值为nil ,包含图层动作的字典。可以使用此字典存储图层的自定义操作。

** + (id<CAAction>)defaultActionForKey:(NSString *)event;**
默认操作。

坐标和时间之间的映射

** - (CGPoint)convertPoint:(CGPoint)p fromLayer:(CALayer *)l;**
把指定图层 LayerA 中的坐标点P转换为接收对象 LayerB 的坐标点。

** - (CGPoint)convertPoint:(CGPoint)p toLayer:(CALayer *)l;**
把接收对象 LayerB 的中坐标点P 转换为指定图层 LayerA 中的坐标点。

** - (CGRect)convertRect:(CGRect)r fromLayer:(CALayer *)l;**

把指定图层 LayerA 中的矩形区域rect转换为接收对象 LayerB 的矩形区域。

** - (CGRect)convertRect:(CGRect)r toLayer:(CALayer *)l;**
把接收对象 LayerB 的矩形区域rect转换为指定图层 LayerA 中矩形区域。

** - (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l;**
把指定图层 LayerA 中的时间间隔t转换为接收对象 LayerB 的时间间隔。

** - (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l;**
把接收对象 LayerB 的时间间隔t转换为指定图层 LayerA 中的时间间隔。

测试

** - (CALayer *)hitTest:(CGPoint)p;**
返回包含指定点的图层层次结构(包括自身)中接收器的最底层的图层。

** - (BOOL)containsPoint:(CGPoint)p;**
接收对象是否包含指定点。

滚动

** @property(readonly) CGRect visibleRect;**
图层在其自己的坐标空间中的可见区域。可见区域是未被包含滚动层剪切的区域。

** - (void)scrollPoint:(CGPoint)p;**
当前图层中应该滚动到位置的点。

** - (void)scrollRectToVisible:(CGRect)r;**
在当前可见区域内滚动。

标识辨别

** @property(copy) NSString *name;**
默认值为nil ,一些布局管理器使用图层名称来标识图层。

键值编码扩展

** - (BOOL)shouldArchiveValueForKey:(NSString *)key;**

是否应存档指定键的值。若应归档,则为 YES ,若不归档,则为 NO

** + (id)defaultValueForKey:(NSString *)key;**
与指定键关联的默认值。

常量

** CAAutoresizingMask**

** Action Identifiers**

** CAEdgeAntialiasingMask**

** Contents Gravity Values**

** Identity Transform**

** Scaling Filters**

** CATransform3D**

变换矩阵用于旋转,缩放,平移,倾斜和投影层内容。 提供了用于创建,连接和修改CATransform3D数据的函数。字段:

初始化

** + (CALayer *)layerWithRemoteClientId:(uint32_t)client_id;**
官方文档未作出解释。

Layer 与 View


Layer 与 View .png

CALayer 的子类以及用途


CALayer 的子类以及用途.png

本文参考苹果官方文档翻译,如有误,请指出,谢谢。

上一篇下一篇

猜你喜欢

热点阅读