【译】iOS CALayer 官方文档(2)

739 阅读33分钟

Configuring the Layer’s Rendering Behavior(配置图层的渲染行为)

opaque

 一个布尔值,指示该图层是否包含完全不透明的内容。

@property(getter=isOpaque) BOOL opaque;

 此属性的默认值为 NO。如果应用程序绘制的内容完全不透明,并且填充了层的 bounds,则将此属性设置为 YES 可使系统优化层的呈现行为。具体来说,当层为绘图命令创建 backing store 时,Core Animation 会忽略该 backing store 的 alpha 通道。这样做可以提高合成操作的性能。如果将此属性的值设置为 YES,则必须用不透明内容填充图层 bounds。

 设置此属性仅影响由 Core Animation 管理的 backing store。如果你将具有 Alpha 通道的图像分配给图层的 contents 属性,则该图像将保留其 Alpha 通道,而不管该属性的值如何。

 提示 - drawInContext: 提供的图层内容是完全不透明的。默认为 NO。请注意,这不会直接影响对 contents 属性的解释。

edgeAntialiasingMask

 定义如何光栅化 CALayer 边缘的位掩码。

@property CAEdgeAntialiasingMask edgeAntialiasingMask;

 此属性指定层的哪些边缘被消除锯齿,并且是 CAEdgeAntialiasingMask 中定义的常量的组合。你可以分别为每个边缘(顶部,左侧,底部,右侧)启用或禁用抗锯齿。默认情况下,所有边缘均启用抗锯齿。

 通常,你将使用此属性为与其他层的边缘邻接的边缘禁用抗锯齿,以消除否则会发生的接缝。

- contentsAreFlipped

 返回一个布尔值,指示在渲染时是否隐式翻转图层内容。

- (BOOL)contentsAreFlipped;

 Return Value: 如果在渲染时隐式翻转了图层内容,则为 YES;否则为 NO。默认情况下,此方法返回 NO。

 此方法提供有关在绘制过程中是否翻转图层内容的信息。你不应尝试覆盖此方法并返回其他值。

 如果图层需要翻转其内容,则它会从此方法返回 YES,并将 y-flip 转换应用于图形上下文,然后再将其传递给图层的 - drawInContext: 方法。同样,该图层会将传递给其 - setNeedsDisplayInRect: 的所有矩形转换为翻转的坐标空间。

geometryFlipped

 一个布尔值,指示该层及其子层的 geometry 是否垂直翻转。

@property(getter=isGeometryFlipped) BOOL geometryFlipped;

 如果层为 layer-backed view 提供支持,则该视图负责管理此属性中的值。对于独立图层,此属性控制是使用标准坐标系还是翻转坐标系来解释图层的 geometry。此属性的值不影响图层内容的呈现。

 此属性的默认值为 NO。

 图层(及其子图层)的几何形状是否垂直翻转。默认为 NO。请注意,即使在翻转几何图形时,图像方向也保持不变(即存储在 contents 属性中的 CGImageRef 将显示相同的内容,并假设在层上未进行任何变换时,flipd = NO 和 flipped = YES)。

drawsAsynchronously

 一个布尔值,指示是否在后台线程中延迟和异步处理绘制命令。

@property BOOL drawsAsynchronously API_AVAILABLE(macos(10.8), ios(6.0), watchos(2.0), tvos(9.0));

 当此属性设置为 YES 时,用于绘制图层内容的图形上下文将对绘制命令进行排队,并在后台线程上执行这些命令,而不是同步执行这些命令。异步执行这些命令可以提高某些应用程序的性能。但是,在启用此功能之前,你应该始终衡量实际的性能优势。

 此属性的默认值为 NO。

 如果为 true,则传递给 - drawInContext: 方法的 CGContext 对象可以将提交给它的绘图命令排入队列,以便稍后执行它们(即,与 - drawInContext: 方法的执行异步)。这可以允许该层比同步执行时更快地完成其绘制操作。默认值为 NO。

shouldRasterize

 一个布尔值,指示在合成之前是否将图层渲染为位图。可动画的

@property BOOL shouldRasterize;

 当此属性的值为 YES 时,层将在其局部坐标空间中渲染为位图,然后与任何其他内容合成到目标。阴影效果和 filters 属性中的任何过滤器都将光栅化并包含在位图中。但是,层的当前不透明度未光栅化。如果光栅化位图在合成过程中需要缩放,则会根据需要应用 minificationFilter 和 magnificationFilter 属性中的过滤器。

 如果此属性的值为 NO,则在可能的情况下将图层直接复合到目标中。如果合成模型的某些功能(例如包含滤镜)需要,则在合成之前仍可以对图层进行栅格化。

 此属性的默认值为 NO。

rasterizationScale

 相对于图层的坐标空间栅格化内容的比例。可动画的。

@property CGFloat rasterizationScale;

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

contentsFormat

 有关所需的图层内容存储格式的提示。

@property(copy) CALayerContentsFormat contentsFormat API_AVAILABLE(macos(10.12), ios(10.0), watchos(3.0), tvos(10.0));

 此属性的默认值为 kCAContentsFormatRGBA8Uint。

 UIView 和层备份 NSView 对象可能会将值更改为适合当前设备的格式。

- drawLayerInContext 提供的层内容的所需存储格式的提示。默认为 kCAContentsFormatRGBA8Uint。注意,这不会直接影响对 contents 属性的解释。

- renderInContext:

 将图层及其子图层渲染​​到指定的上下文中。

- (void)renderInContext:(CGContextRef)ctx;

ctx: 用于渲染图层的图形上下文。

 此方法直接从图层树进行渲染,而忽略添加到渲染树的所有动画。在图层的坐标空间中渲染。

 Important: 此方法的 OS X v10.5 实现不支持整个 Core Animation 合成模型。不呈现 QCCompositionLayer、CAOpenGLLayer 和 QTMovieLayer 图层。此外,不会渲染使用 3D 变换的图层,也不会渲染指定 backgroundFilters、filters、compositingFilter 或 mask 值的图层。未来的 macOS 版本可能会增加对渲染这些图层和属性的支持。

Modifying the Layer Geometry(修改图层 Geometry)

frame

 图层的 frame 矩形。

@property CGRect frame;

 frame 矩形是在 superlayer 坐标空间中指定的层的位置和大小。对于图层,frame 矩形是从 bounds、anchorPoint 和 position 属性中的值派生的计算属性。为该属性分配新值时,图层将更改其 position 和 bounds 属性以匹配你指定的矩形。矩形中每个坐标的值以点为单位。

 如果 transform 属性应用的旋转变换不是 90 度的倍数,则不要设置 frame。

 有关 frame、bounds、anchorPoint 和 position 属性之间的关系的更多信息,请参见 Core Animation Programming Guide。

 Note: frame 属性不能直接设置动画。相反,你应该为 bounds、anchorPoint 和 position 属性的适当组合设置动画,以实现所需的结果。

 与 NSView 不同,层次结构中的每个图层都有一个隐式 frame 矩形,它是 position、bounds、anchorPoint 和 transform 属性的函数。设置 frame 时,将更改 position 和 bounds.size 以匹配给定的 frame 的值。

bounds

 图层的边界矩形。可动画的。

@property CGRect bounds;

 边界矩形是图层在其自身坐标空间中的原点和大小。创建新的独立图层时,此属性的默认值为一个空矩形,你必须在使用该图层之前对其进行更改。矩形中每个坐标的值以点为单位。

 图层的边界。默认为 CGRectZero。可动画的。

position

 图层在其 superlayer 坐标空间中的位置。可动画的。

@property CGPoint position;

 此属性的值以磅为单位指定,并且始终相对于 anchorPoint 属性中的值指定。对于新的独立图层,默认位置设置为(0.0,0.0)。更改 frame 属性也会更新此属性中的值。

 层边界的定位点 rect 对准的 superlayer 位置。默认为零。可动画的。

zPosition

 图层在 z 轴上的位置。可动画的。

@property CGFloat zPosition;

 该属性的默认值为 0。更改此属性的值将更改屏幕上各图层的前后顺序。较高的值比较低的值在视觉上更靠近该图层。这会影响 frame 矩形重叠的图层的可见性。

 此属性的值以点为单位。此属性的范围是单精度浮点 -greatestFiniteMagnitudegreatFiniteMagnitude

 图层在其 superlayer 中位置的 Z 分量。默认为 zero。可动画的。

anchorPointZ

 图层沿 z 轴位置的锚点。可动画的。

@property CGFloat anchorPointZ;

 此属性指定围绕 z 轴进行几何操作的锚点。该点表示为沿 z 轴的距离(以点为单位)。此属性的默认值为 0。

 图层锚点(即位置和变换的参考点)的 Z 分量。默认为 zero。可动画的。

anchorPoint

 定义图层边界矩形的锚点。可动画的。

@property CGPoint anchorPoint;

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

contentsScale

 应用于图层的比例因子。

@property CGFloat contentsScale API_AVAILABLE(macos(10.7), ios(4.0), watchos(2.0), tvos(9.0));

 此值定义层的逻辑坐标空间(以点为单位)和物理坐标空间(以像素为单位)之间的映射。比例因子越高,表示渲染时该层中的每个点都由一个以上的像素表示。例如,如果比例因子为 2.0,并且图层边界为 50 x 50 点,则用于显示图层内容的位图大小为 100 x 100 像素。

 此属性的默认值为 1.0。对于附加到视图的图层,视图将比例因子自动更改为适合当前屏幕的值。对于你自己创建和管理的图层,你必须根据屏幕的分辨率和所提供的内容自行设置此属性的值。 Core Animation 使用你指定的值作为提示来确定如何呈现内容。

 定义应用于图层内容的比例因子。如果内容的物理大小为(w,h),则逻辑大小(即用于 contentGravity 计算)定义为(w / contentsScale,h / contentsScale)。适用于显式提供的图像和通过 - drawInContext: 提供的内容(即,如果 contentScale 为 two,则 - drawInContext: 将绘制为两倍于图层边界的缓冲区)。默认为 1。可动画的。

Managing the Layer’s Transform(管理图层的转换(旋转))

transform

 转换应用于图层的内容。可动画的。

@property CATransform3D transform;

 默认情况下,此属性设置为标识转换。你应用于图层的所有变换都相对于图层的锚点进行。

 相对于其 bounds rect 的锚点应用于图层的变换。默认为 identity 转换。可动画的。

sublayerTransform

 指定在渲染时应用于子层的变换。可动画的。

@property CATransform3D sublayerTransform;

 通常,你可以使用此属性为嵌入的图层添加 perspective 和其他 view 效果。你可以通过将子层变换设置为所需的投影矩阵(projection matrix)来添加 perspective。此属性的默认值为 identity 转换。

 在将其内容呈现到 CALayer 的输出中时,将变换应用于 sublayers 数组的每个成员。通常用作 projection matrix,以将透视图和其他查看效果添加到模型中。默认为 identity。可动画的。

- affineTransform

 返回图层变换的仿射版本。

- (CGAffineTransform)affineTransform;

 仿射变换结构,对应于图层的 transform 属性中的值。

 作为仿射变换访问 transform 属性的便捷方法。

- setAffineTransform:

 将图层的变换设置为指定的仿射变换。

- (void)setAffineTransform:(CGAffineTransform)m;

m: 仿射变换,用于图层的变换。

Managing the Layer Hierarchy(管理 CALayer 层次结构)

sublayers

 包含图层子图层的数组。

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

 子层以从前到后的顺序列出。此属性的默认值为 nil。

 将 sublayers 属性设置为填充有图层对象的数组时,该数组中的每个图层都必须尚未具有 superlayer -也就是说,其 superlayer 属性当前必须为 nil。

 此 CALayer 的 sublayers 数组。层以从后到前的顺序列出。默认为 零。设置属性的值时,任何新添加的层都必须具有 nil superlayer,否则行为是不确定的。请注意,不能保证返回的数组 retain 其元素。

superlayer

 层的 superlayer。

@property(nullable, readonly) CALayer *superlayer;

 superlayer 管理其子层的布局。

- addSublayer:

 将图层添加到图层的子图层列表中。

- (void)addSublayer:(CALayer *)layer;

layer: 要添加的层。

 如果 sublayers 属性中的数组为 nil,则调用此方法将为该属性创建一个数组,并将指定的图层添加到该数组。

 在 CALayer 的子层数组的末尾添加 CALayer。如果 CALayer 已经具有 superlayer,则将其删除后再添加。(更改其 superlayer)

- removeFromSuperlayer

 从其父层移除该层。

- (void)removeFromSuperlayer;

 你可以使用此方法从图层层次结构中删除图层(及其所有子图层)。此方法会同时更新 superlayer 的子图层列表,并将该图层的 superlayer 属性设置为 nil。

 从 CALayer 的 superlayer 移除该层,如果接收者位于其 superlayer 的 sublayers 数组中或设置为 mask 值,则两者均可工作。(CALayer 的 mask 也是作为该 CALayer 的子层存在的。)

- insertSublayer:atIndex:

 将指定的图层插入到 CALayer 的 sublayers 列表的指定索引处。

- (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;

layer: 要插入当前层的子层。idx: 插入图层的索引。此值必须是 sublayers 数组中基于 0 的有效索引。

 在 CALayer 的 sublayers 中的 idx 位置插入 layer 。如果 layer 已经具有 superlayer,则在插入之前将其删除。

- insertSublayer:below:

 将指定的子层插入已经属于 CALayer 的另一个子层下。

- (void)insertSublayer:(CALayer *)layer below:(nullable CALayer *)sibling;

layer: 要插入当前层的子层。sibling: 当前层中的现有子层。图层中的图层在子图层阵列中插入到该图层的前面,因此在外观上看起来是在其后面。

 如果 sibling 不在接收者的子图层数组中,则此方法会引发异常。

- insertSublayer:above:

 将指定的子层插入到已经属于接收方的另一个子层之上。

- (void)insertSublayer:(CALayer *)layer above:(nullable CALayer *)sibling;

layer: 要插入当前层的子层。sibling: 当前层中的现有子层。图层中的图层插入到子图层阵列中的该图层之后,因此从视觉上显示在其前面。

- replaceSublayer:with:

 将指定的子图层替换为其他图层对象。

- (void)replaceSublayer:(CALayer *)oldLayer with:(CALayer *)newLayer;

oldLayer: 要替换的层。newLayer: 用来替换 oldLayer 的图层。

 如果 oldLayer 不在接收者的子图层数组中,则此方法的行为是不确定的。

 从 CALayer 的 sublayers 中删除 oldLayer,并在其位置非零时插入 newLayer。如果 oldLayer 的 superlayer 不是接收者,则行为是不确定的。

Updating Layer Display(更新 CALayer 显示)

- setNeedsDisplay

 将图层的内容标记为需要更新。

- (void)setNeedsDisplay;

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

 标记 - display 需要在下一次提交层之前被调用。如果指定了区域,则仅该层的该区域无效。

- setNeedsDisplayInRect:

 将指定矩形内的区域标记为需要更新。

- (void)setNeedsDisplayInRect:(CGRect)r;

r: 标记为无效的图层的矩形区域。你必须在图层自己的坐标系中指定此矩形。

needsDisplayOnBoundsChange

 一个布尔值,指示当其 bounds 矩形更改时是否必须更新图层内容。

@property BOOL needsDisplayOnBoundsChange;

 如果为 true,则在更改图层 bounds 时将自动调用 - setNeedsDisplay。默认值为 NO。

- displayIfNeeded

 如果图层当前被标记为需要更新,则启动该图层的更新过程。

- (void)displayIfNeeded;

 你可以根据需要调用此方法,以在正常更新周期之外强制对图层内容进行更新。但是,通常不需要这样做。更新图层的首选方法是调用 - setNeedsDisplay,并让系统在下一个周期更新图层。

 如果接收方被标记为需要重绘,则调用 - display

- needsDisplay

 返回一个布尔值,指示该图层是否已标记为需要更新。

- (BOOL)needsDisplay;

 YES,如果需要更新图层。

 将图层标记为需要重绘时,返回 YES。

+ needsDisplayForKey:

 返回一个布尔值,指示对指定 key 的更改是否需要重新显示该图层。

+ (BOOL)needsDisplayForKey:(NSString *)key;

key: 一个字符串,它指定图层的属性。

 Return Value: 如果该图层需要重新显示,则为 YES。

 子类可以重写此方法,如果在指定属性的值更改时应重新显示该图层,则返回 YES。更改属性值的动画也会触发重新显示。

 此方法的默认实现返回 NO。

 子类重写的方法。对于给定的属性,返回 YES 会导致更改属性时(包括通过附加到该图层的动画进行更改时)重绘该图层的内容。默认实现返回 NO。子类应为超类定义的属性调用超类。(例如,不要尝试对 CALayer 实现的属性返回YES,这样做会产生不确定的结果。)

Layer Animations(CALayer 动画)

- addAnimation:forKey:

 将指定的动画对象添加到图层的渲染树(render tree)。(目前为止已经见到过 "表示树"、"模型树"、"渲染树"、"层级树",在 Core Animation 文档里面都能得到解释)

- (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;

anim: 要添加到渲染树的动画。该对象由渲染树复制,不引用(not referenced)。因此,对动画对象的后续修改不会传播到渲染树中。key: 标识动画的字符串。每个唯一键仅将一个动画添加到该层。特殊键 kCATransition 自动用于过渡动画。你可以为此参数指定 nil。

 如果动画的 duration 属性为零或负,则将 duration 更改为 kCATransactionAnimationDuration 事务属性的当前值(如果已设置)或默认值为 0.25 秒。

 将动画对象附加到图层。通常,这是通过作为 CAAnimation 对象的 action 隐式调用的。(CAAnimation 遵循 CAAction 协议)

 key 可以是任何字符串,因此每个唯一 key 每个图层仅添加一个动画。特殊键 transition 会自动用于过渡动画(transition animations)。 nil 指针也是有效的键。

 如果动画的 duration 属性为零或负数,则指定默认持续时间,否则为 animationDuration transaction 属性的值,否则为 0.25 秒。

 在将动画添加到图层之前先对其进行复制,因此,除非对动画进行任何后续修改,否则将其添加到另一层都不会产生影响。

- animationForKey:

 返回具有指定标识符的动画对象。

- (nullable __kindof CAAnimation *)animationForKey:(NSString *)key;

key: 一个字符串,指定动画的标识符。该字符串对应于你传递给 - addAnimation:forKey: 方法的标识符字符串。

 Return Value: 匹配标识符的动画对象;如果不存在这样的动画,则为 nil。

 你可以使用此字符串来检索已经与图层关联的动画对象。但是,你不得修改返回对象的任何属性。这样做将导致不确定的行为。

 返回添加到带有标识符 key 的 CALyaer 的动画;如果不存在这样的动画,则返回 nil。尝试修改返回对象的任何属性将导致未定义的行为。

- removeAllAnimations

 删除所有附加到该图层的动画。

- (void)removeAllAnimations;

- removeAnimationForKey:

 使用指定的 key 删除动画对象。

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

key: 要删除的动画的标识符。

- animationKeys

 返回一个字符串数组,这些字符串标识当前附加到该图层的动画。

- (nullable NSArray<NSString *> *)animationKeys;

 Return Value: 标识当前动画的 NSString 对象数组。

 数组的顺序与将动画应用于图层的顺序匹配。

 可看到 layout 和 display 的一组方法的使用方式和命名方式基本相同。- setNeedsDisplay/- setNeedsLayout 标记在下一个周期需要进行 display/layout,- displayIfNeeded/- layoutIfNeeded 如果需要则执行 display/layout,- needsDisplay/- needsLayout 返回是否需要 display/layout,- display/- layoutSublayers 更新执行 display/layout。

Managing Layer Resizing and Layout(管理图层调整大小和布局)

layoutManager

 负责管理图层的子图层布局的对象。

@property(strong) id<CALayoutManager> layoutManager;

 你分配给此属性的对象必须名义上实现 CALayoutManager 非正式协议非正式协议。如果图层的 delegate 不处理布局更新,则分配给此属性的对象将有机会更新图层的子图层的布局。

 在 macOS 中,如果你的图层使用 layer-based 的约束来处理布局更改,则将 CAConstraintLayoutManager 类的实例分配给此属性。

 此属性的默认值为nil。

- setNeedsLayout

 使图层的布局无效,并将其标记为需要更新。

- (void)setNeedsLayout;

 你可以调用此方法来指示图层的子图层的布局已更改,必须进行更新。通常,在更改图层 bounds 或添加或删除子图层时,系统会自动调用此方法。在 macOS 中,如果你图层的 layoutManager 属性包含一个实现 invalidateLayoutOfLayer: 方法的对象,则也将调用该方法。

 在下一个更新周期中,系统将调用需要布局更新的任何图层的 - layoutSublayers 方法。

 只要修改了 sublayers 或 layoutManager 属性,便会在该层上自动调用此方法,并且只要修改其 bounds 或 transform 属性,便会在该层及其 superlayer 上自动调用此方法。如果图层当前正在执行其 - layoutSublayers 方法,则将跳过对 - setNeedsLayout 的隐式调用。

- layoutSublayers

 告诉图层更新其布局。

- (void)layoutSublayers;

 子类可以重写此方法,并使用它来实现自己的布局算法。你的实现必须设置由 CALayer 管理的每个子层的 frame。

 此方法的默认实现调用该图层的 delegate 的 layoutSublayersOfLayer: 方法。如果没有 delegate 对象,或者 delegate 没有实现该方法,则此方法在 layoutManager 属性中调用对象的 layoutSublayersOfLayer: 方法。

 在图层需要布局时调用。默认实现会调用布局管理器(如果存在的话),并且会实现 - layoutSublayersOfLayer: 方法。子类可以重写此方法以提供自己的布局算法,该算法应设置每个子层的 frame。

- layoutIfNeeded

 如果需要,请重新计算 CALayer 的布局。

- (void)layoutIfNeeded;

 收到此消息后,将遍历图层的 super layers,直到找到不需要布局的祖先图层(沿着 superlayer 链一直找到不需要布局的 CALayer)。然后在该祖先下的整个层树上执行布局。

 从图层向上遍历,而 superlayer 需要布局。然后将整个树布局在该祖先下。

- needsLayout

 返回一个布尔值,指示是否已将图层标记为需要布局更新

- (BOOL)needsLayout;

 如果已将图层标记为需要布局更新,则为 YES。

autoresizingMask

 一个位掩码,用于定义当其 superlayer bounds 更改时如何调整其大小。

@property CAAutoresizingMask autoresizingMask;

 如果你的应用未使用布局管理器或约束来处理布局更改,则可以为该属性分配一个值,以响应 superlayer bounds 的更改来调整图层的大小。有关可能值的列表,请参见 CAAutoresizingMask。

 此属性的默认值为 kCALayerNotSizable。

- resizeWithOldSuperlayerSize:

 通知 CALayer 其 superlayer 大小已更改。

- (void)resizeWithOldSuperlayerSize:(CGSize)size;

size: superlayer 的先前大小。

 当 autoresizingMask 属性用于调整大小并且层的 bounds 更改时,该层在其每个子层上调用此方法。子层使用此方法调整自己的 frame 矩形以反映新的 superlayer bounds,可以直接从 superlayer 检索。superlayer 的旧大小被传递给这个方法,这样子层就有了它必须进行的任何计算所需的信息。

- resizeSublayersWithOldSize:

 通知 CALayer 的子层接收者的尺寸已更改。

- (void)resizeSublayersWithOldSize:(CGSize)size;

size: 当前 CALayer 的先前大小。

 当将 autoresizingMask 属性用于调整大小并且此层的 bounds 发生变化时,该层将调用此方法。默认实现会调用每个子层的 resizeWithOldSuperlayerSize: 方法,以使其知道其 superlayer 的 bounds 已更改。你不需要直接调用或重写此方法。

- preferredFrameSize

 返回其 superlayer 坐标空间中该层的首选大小。

- (CGSize)preferredFrameSize;

 Return Value: 图层的首选 frame 大小。

 在 macOS 中,此方法的默认实现调用其布局管理器的 - preferredSizeOfLayer: 方法,即 layoutManager 属性中的对象。如果该对象不存在或未实现该方法,则此方法返回映射到其 superlayer 坐标空间的层当前 bounds 矩形的大小。

Managing Layer Constraints(管理 CALayer 约束)

constraints

 用于定位当前图层的子图层的约束。

@property(copy) NSArray<CAConstraint *> *constraints;

 macOS 应用程序可以使用此属性来访问其 layer-based 的约束。在应用约束之前,还必须将 CAConstraintLayoutManager 对象分配给图层的 layoutManager 属性。

 iOS 应用程序不支持基于图层的约束。

- addConstraint:

 将指定的约束添加到图层。

- (void)addConstraint:(CAConstraint *)c;

c: 约束对象添加到 CALayer 的约束对象数组中。

 在 macOS 中,通常向层添加约束以管理该层子层的大小和位置。在应用约束之前,还必须将 CAConstraintLayoutManager 对象指定给层的 layoutManager 属性。有关管理基于层的约束的详细信息,请参见 Core Animation Programming Guide.。

 iOS 应用程序不支持基于图层的约束。

Getting the Layer’s Actions(获取 CALayer 的 action)

- actionForKey:

 返回分配给指定 key 的 action 对象。

- (nullable id<CAAction>)actionForKey:(NSString *)event;

event: action 的标识符。

 Return Value: 返回提供键操作的对象。该对象必须实现 CAAction 协议。

 此方法搜索层的给定 action 对象。action 定义层的动态行为。例如,层的可设置动画的属性通常具有相应的 action 对象来启动实际动画。当该属性更改时,层将查找与属性名称关联的 action 对象并执行它。还可以将自定义 action 对象与层关联,以实现特定于应用程序的动作。

 返回与由字符串 event 关联的 action 对象。默认实现在以下位置搜索 action 对象:

  1. if defined, call the delegate method -actionForLayer:forKey:(如果已实现,则调用 delegate 方法 - actionForLayer:forKey:
  2. look in the layer's 'actions' dictionary(查看一下 CALayer 的 actions dictionaries)
  3. look in any 'actions' dictionaries in the 'style' hierarchy(查看 style 层次结构中的所有 actions dictionaries)
  4. call +defaultActionForKey: on the layer's class(在 layer 的类上调用 + defaultActionForKey: 方法)

 如果这些步骤中的任何一个导致非空 action 对象,则以下步骤将被忽略。如果最终结果是 NSNull 的实例,则将其转换为 nil。

actions

 包含图层 action 的字典。

@property(nullable, copy) NSDictionary<NSString *, id<CAAction>> *actions;

 此属性的默认值为 nil。你可以使用此字典存储图层的自定义 action。搜索该 dictionary 的内容,作为 - actionForKey: 方法的标准实现的一部分。

 dictionary 将 key 映射到实现 CAAction 协议的对象。默认值为 nil。

+ defaultActionForKey:

 返回当前类的默认 action 对象。

+ (nullable id<CAAction>)defaultActionForKey:(NSString *)event;

event: action 的标识符。

 Return Value: 返回给定 enent 的合适 action 对象,或者没有与该 event 关联的 action 对象时返回 nil。

 想要提供默认 action 的类可以重写此方法,并使用它返回那些 action。

/* An "action" is an object that responds to an "event" via the CAAction protocol (see below). Events are named using standard dot-separated key paths. Each layer defines a mapping from event key paths to action objects. Events are posted by looking up the action object associated with the key path and sending it the method defined by the CAAction protocol.

 action 是通过 CAAction 协议响应 event 字符串的对象。使用标准的点分隔 key path 来命名事件。每一层都定义了从 event key path 到 action 对象的映射。通过查找与 key path 关联的 action 对象并向其发送 CAAction 协议定义的方法,可以发布事件(执行 action)。  调用 action 对象时,它会接收三个参数:命名事件的键路径,发生事件的对象(即图层)以及可选的特定于每个事件的命名参数字典。(即 CAAction 协议中的唯一一个协议函数:- (void)runActionForKey:(NSString *)event object:(id)anObject arguments:(nullable NSDictionary *)dict;)  为了给图层属性提供隐式动画,只要属性值被修改,就会发布一个与每个属性同名的事件。默认情况下,合适的 CAAnimation 对象与每个隐式事件关联(CAAnimation 实现动作协议)。 图层类还定义了以下未直接链接到属性的事件:  onOrderIn  Invoked when the layer is made visible, i.e. either its superlayer becomes visible, or it's added as a sublayer of a visible layer  当该图层变为可见时调用,即该图层的 superlayer 变为可见,或将其添加为可见层的子层。  onOrderOut  Invoked when the layer becomes non-visible. 当图层变为不可见时调用。  返回与字符串 event 命名的事件关联的默认 action 对象。默认实现为可动画属性发布的事件返回合适的动画对象,否则为 nil。

Mapping Between Coordinate and Time Spaces(坐标与时间空间的映射)

- convertPoint:fromLayer:

 将点从指定图层的坐标系转换为 receiver 的坐标系。

- (CGPoint)convertPoint:(CGPoint)p fromLayer:(nullable CALayer *)l;

p: 指定l坐标系中位置的点。l: 在其坐标系中具有p的层。接收者和l和必须共享一个公共父层。此参数可以为nil。

 Return Value: 该点将转换为接收者的坐标系。

 如果为l参数指定nil,则此方法返回从图层帧的原点减去的原始点。

- convertPoint:toLayer:

 将点从接收者的坐标系转换为指定图层的坐标系。

- (CGPoint)convertPoint:(CGPoint)p toLayer:(nullable CALayer *)l;

p: 指定 l 坐标系中位置的点。l: 要将坐标系 p 转换为的图层。接收者和 l 必须共享一个公共父层。此参数可以为 nil。

 Return Value: 点转换为图层的坐标系。

 如果为 l 参数指定 nil,则此方法返回添加到图层 frame 原点的原始点。

- convertRect:fromLayer:

 将矩形从指定图层的坐标系转换为接收者的坐标系。

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

r: 指定 l 坐标系中位置的 CGRect。l: 在其坐标系中具有 r 的图层。接收者和 l 和必须共享一个公共父层。此参数可以为 nil。

 Return Value: 矩形将转换为接收者的坐标系。

 如果为 l 参数指定 nil,则此方法将返回原始 rect,其原点将从图层 frame 的原点中减去。

- convertRect:toLayer:

 将矩形从接收者的坐标系转换为指定图层的坐标系。

- (CGRect)convertRect:(CGRect)r toLayer:(nullable CALayer *)l;

r: 指定 l 坐标系中位置的点。l: 要转换其坐标系 r 的图层。接收者和 l 必须共享一个公共父层。此参数可以为 nil。

 Return Value: 矩形转换为 l 的坐标系。

 如果为 l 参数指定 nil,则此方法将返回原始 rect,并将其原点添加到图层 frame 的原点。

- convertTime:fromLayer:

 将时间间隔从指定层的时间空间转换为接收者的时间空间。

- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(nullable CALayer *)l;

t: 将时间间隔从指定层的时间空间转换为接收者的时间空间。l: 时空为 t 的图层。接收者和 l 必须共享一个公共父层。

 Return Value: 时间间隔转换为接收者的时间空间。

- convertTime:toLayer:

 将时间间隔从接收者的时间空间转换为指定层的时间空间

- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(nullable CALayer *)l;

t: 指定 l 坐标系中位置的点。l: 要将时间空间 t 转换为该层。接收者和 l 和必须共享一个公共父层。

 时间间隔转换为图层的时间空间。

Hit Testing(命中测试)

- hitTest:

 返回包含指定点的图层层次结构中接收者的最远后代(包括自身)。(看来 iOS 中 UIView 的 Hit-Testing 内部完全是靠 CALayer 的 Hit-Testing 实现的)

- (nullable __kindof CALayer *)hitTest:(CGPoint)p;

p: 接收者的 superlayer 坐标系中的一点。

 Return Value: 包含 thePoint 的图层;如果该点位于接收者的 bounds 矩形之外,则为 nil。

/* Returns the farthest descendant of the layer containing point 'p'. Siblings are searched in top-to-bottom order. 'p' is defined to be in the coordinate space of the receiver's nearest ancestor that isn't a CATransformLayer (transform layers don't have a 2D coordinate space in which the point could be specified). */

 返回包含点 p 的层的最远后代。兄弟姐妹以自上而下的顺序搜索。p 被定义为位于接收者的最近祖先的坐标空间中,该坐标空间不是 CATransformLayer(转换层没有可以在其中指定点的 2D 坐标空间)。

- containsPoint:

 返回接收者是否包含指定点。

- (BOOL)containsPoint:(CGPoint)p;

p: 接收者坐标系中的一个点。

Scrolling(滚动)

visibleRect

 图层在其自己的坐标空间中的可见区域。

@property(readonly) CGRect visibleRect;

 可见区域是未被包含的滚动层剪切的区域。

- scrollPoint:

 在该层的最接近的祖先滚动层中启动滚动,以使指定点位于滚动层的原点。

- (void)scrollPoint:(CGPoint)p;

p: 当前图层中应滚动到位置的点。

 如果 CAScrollLayer 对象不包含该图层,则此方法不执行任何操作。

- scrollRectToVisible:

 在该图层的最接近的祖先滚动图层中启动滚动,以使指定的矩形变为可见。

- (void)scrollRectToVisible:(CGRect)r;

r: 要显示的矩形。

 如果 CAScrollLayer 对象不包含该图层,则此方法不执行任何操作。

Identifying the Layer(标识 CALyaer)

name

 接收者的名字。

@property(nullable, copy) NSString *name;

 某些布局管理器使用图层名称来标识图层。此属性的默认值为 nil。

Key-Value Coding Extensions(键值编码扩展)

- shouldArchiveValueForKey:

 返回一个布尔值,指示是否应归档指定键的值。

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

key: 接收者属性之一的名称。

 Return Value: 如果应将指定的属性归档,则为 YES;否则,则为 NO。

 默认实现返回 YES。

 由对象的 - encodeWithCoder: 的实现调用,如果不应 archived 命名属性,则返回 false。基本实现返回 YES。子类应为未知属性调用 super。

+ defaultValueForKey:

 指定与指定键关联的默认值。

+ (nullable id)defaultValueForKey:(NSString *)key;

key: 接收者属性之一的名称。

 Return Value: 命名属性的默认值。如果未设置默认值,则返回 nil。

 如果为图层定义自定义属性,但未设置值,则此方法将基于键的预期值返回适当的 zero 默认值。例如,如果 key 的值是 CGSize 结构,则该方法返回一个包含(0.0,0.0)的大小结构,该结构封装在 NSValue 对象中。对于 CGRect,返回一个空矩形。对于 CGAffineTransform 和 CATransform3D,将返回相应的单位矩阵。

 如果 key 对于该类的属性未知,则该方法的结果不确定。

/* CALayer implements the standard NSKeyValueCoding protocol for all Objective C properties defined by the class and its subclasses. It dynamically implements missing accessor methods for properties declared by subclasses.

 CALayer 为该类及其子类定义的所有 Objective-C 属性实现标准的 NSKeyValueCoding 协议。它为子类声明的属性动态实现缺少的访问器方法。

When accessing properties via KVC whose values are not objects, the standard KVC wrapping conventions are used, with extensions to support the following types:

 通过值不是对象的 KVC 访问属性时,将使用标准的 KVC 包装约定,并带有扩展以支持以下类型:

C TypeClass
CGPointNSValue
CGSizeNSValue
CGRectNSValue
CGAffineTransformNSValue
CATransform3DNSValue

 返回指定属性的默认值,如果没有默认值,则返回 nil。重写此方法为自己的属性定义默认值的子类应为未知属性调用 super。

Constants(常量)

CAAutoresizingMask

 这些常量由 autoresizingMask 属性使用。

typedef enum CAAutoresizingMask : unsigned int {
    ...
} CAAutoresizingMask;
  • kCALayerNotSizable = 0: 接收器无法调整大小。
  • kCALayerMinXMargin = 1U << 0: 接收者及其 superlayer 之间的左边界是灵活的。
  • kCALayerWidthSizable = 1U << 1: 接收器的宽度很灵活。
  • kCALayerMaxXMargin = 1U << 2: 接收者及其 superlayer 之间的右边距是灵活的。
  • kCALayerMinYMargin = 1U << 3: 接收器及其 superlayer 之间的底部边距很灵活。
  • kCALayerHeightSizable = 1U << 4: 接收器的高度是灵活的。
  • kCALayerMaxYMargin = 1U << 5: 接收者及其 superlayer 之间的上边界是灵活的。

Action Identifiers

 这些常量是预定义 action 标识符用于: actionForKey:addAnimation:forKey:defaultActionForKey:removeAnimationForKey:、Layer Filters 和 CAAction 协议的 runActionForKey:object:arguments: 方法。

NSString *const kCAOnOrderIn;
NSString *const kCAOnOrderOut;
NSString *const kCATransition;
  • kCAOnOrderIn: 表示当某个图层变为可见时(由于将结果插入可见图层层次结构或将该图层不再设置为隐藏)而采取的 action 的标识符。
  • kCAOnOrderOut: 表示从图层层次结构中删除图层或隐藏图层时所采取的 action。
  • kCATransition: 代表过渡动画的标识符。

CAEdgeAntialiasingMask

 edgeAntialiasingMask 属性使用此掩码。

typedef NS_OPTIONS (unsigned int, CAEdgeAntialiasingMask)
{
  kCALayerLeftEdge      = 1U << 0,      /* Minimum X edge. */
  kCALayerRightEdge     = 1U << 1,      /* Maximum X edge. */
  kCALayerBottomEdge    = 1U << 2,      /* Minimum Y edge. */
  kCALayerTopEdge       = 1U << 3,      /* Maximum Y edge. */
};
  • kCALayerLeftEdge: 指定应该对接收者内容的左边缘进行抗锯齿处理。
  • kCALayerRightEdge: 指定应该对接收者内容的右边缘进行锯齿处理。
  • kCALayerBottomEdge: 指定应该对接收者内容的底部边缘进行锯齿处理。
  • kCALayerTopEdge: 指定应该对接收者内容的上边缘进行抗锯齿处理。

Identity Transform

 定义核心动画使用的身份转换矩阵。

const CATransform3D CATransform3DIdentity;

 CATransform3DIdentity.The identity transform: [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1].

Scaling Filters

 这些常量指定 magnificationFilter 和 minificationFilter 使用的缩放过滤器。

kCAFilterLinear

 线性插值滤波器。

const CALayerContentsFilter kCAFilterLinear;
kCAFilterNearest

 最近邻居插值滤波器。

const CALayerContentsFilter kCAFilterNearest;
kCAFilterTrilinear

 三线性缩小过滤器。启用 mipmap 生成。一些渲染器可能会忽略这一点,或施加其他限制,例如需要二维幂的源图像。

const CALayerContentsFilter kCAFilterTrilinear;

CATransform3D

 整个 Core Animation中 使用的标准转换矩阵。

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

struct CATransform3D
{
  CGFloat m11, m12, m13, m14;
  CGFloat m21, m22, m23, m24;
  CGFloat m31, m32, m33, m34;
  CGFloat m41, m42, m43, m44;
};

Instance Properties

cornerCurve

 定义用于渲染层圆角的曲线。默认是 kCACornerCurveCircular。

typedef NSString * CALayerCornerCurve NS_TYPED_ENUM;

CA_EXTERN CALayerCornerCurve const kCACornerCurveCircular API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));
CA_EXTERN CALayerCornerCurve const kCACornerCurveContinuous API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));

@property(copy) CALayerCornerCurve cornerCurve API_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));

Type Methods

+ cornerCurveExpansionFactor:

 使用特定拐角曲线时应用于圆角边界框大小的扩展比例因子。

+ (CGFloat)cornerCurveExpansionFactor:(CALayerCornerCurve)curveAPI_AVAILABLE(macos(10.15), ios(13.0), watchos(6.0), tvos(13.0));

参考链接

参考链接:🔗