QuartzCore(一)CALayer

layer是什么?作用是什么?layer和view有什么关系?认识CALayer。

一、概述

先来看一下官网文档对layer的描述。

Layers are often used to provide the backing store for views but can also be used without a view to display content.

A layer’s main job is to manage the visual content that you provide but the layer itself has visual attributes that can be set, such as a background color, border, and shadow.
In addition to managing visual content, the layer also maintains information about the geometry of its content (such as its position, size, and transform) that is used to present that content onscreen.

Modifying the properties of the layer is how you initiate animations on the layer’s content or geometry. A layer object encapsulates the duration and pacing of a layer and its animations by adopting the CAMediaTiming protocol, which defines the layer’s timing information.

这是一个典型的三段论,半句废话都没有,总结特别到位,让人无可挑剔。

使用layer时的注意事项

If the layer object was created by a view, the view typically assigns itself as the layer’s delegate automatically, and you should not change that relationship.
For layers you create yourself, you can assign a delegate object and use that object to provide the contents of the layer dynamically and perform other tasks.
A layer may also have a layout manager object (assigned to the layoutManager property) to manage the layout of subviews separately.

如果layer对是由view创建的,则此view会自动将自己指定是layer的委托对象。这样的情况下的layer和view,我们不应该去改变layer和view的关系。

这里解释一下:

  1. 每个view初始化的时候都会自带创建layer,并将此layer添加在自身上,layer是提供视图展示的,view之所以能同来展示视图也是基于此。
@property(nonatomic,readonly,strong)                 CALayer  *layer;              // returns view's layer. Will always return a non-nil value. view is layer's delegate
  1. view自身携带的这个layer的委托对象是该view。也就是说view在创建自身的layer的时候,同时将layer的CALayerDelegate协议指定到该view。
/* An object that will receive the CALayer delegate methods defined
 * below (for those that it implements). The value of this property is
 * not retained. Default value is nil. */

@property(nullable, weak) id <CALayerDelegate> delegate;

一句话总结就是view自带的layer我们不要乱玩,如果我们要加新的layer到view上,你可以按照你想的玩。

二、 layer是什么

Layers

图层

呈现视图内容和动画的图层

三、layer的作用

1. 管理视觉内容

  • managing visual content

layer的主要功能是提供基于视觉的内容,它有一些视觉设置属性,比如背景色设置、边框设置、阴影设置等。

2. 维护和处理视觉内容的一些信息

  • maintains information about the geometry of its content

维护和处理视觉内容的一些信息,比如视图层的position、size和transform等信息。

这些信息用来管理视图层在屏幕上的显示。

四、layre的属性和CAMediaTiming协议

A layer object encapsulates the duration and pacing of a layer and its animations by adopting the CAMediaTiming protocol, which defines the layer’s timing information.

修改图层的属性是在图层的内容或几何图形上启动动画的方式。

图层对象采用CAMediaTiming协议封装了图层及其动画的持续时间和步调,该协议定义了图层的计时信息。

五、layer和view的关系

  1. layer是view的视图层
  2. 每个view都会至少携带一个layer,这个layer负责view的视图内容展示,view遵循了layer的协议。
  3. 在view上可以添加图层leyer,通过图层的渲染来更好的显示view。
  4. layer可以不依赖于view的情况下显示视图。
  5. view负责处理响应事件和视图的管理,layer负责视图和动画的显示。

六、CALayer

1. 认识CALayer

The base layer class.

CALayer是layer类的基类。

An object that manages image-based content and allows you to perform animations on that content.

CALayer是一个管理类,管理基于图像的内容,我们可以在图像内容上执行动画。

2. CALayer API

2.1. Layer creation and initialization

一般的初始化方法

/** Layer creation and initialization. **/

+ (instancetype)layer;

/* The designated initializer. */

- (instancetype)init;

使用CoreAnimation时使用该初始化layer的方法可以capy一个新的layer。

- (instancetype)initWithLayer:(id)layer;

这个初始化方法是什么时候用呢?

- (nullable instancetype)presentationLayer;

什么时候用这个?

- (instancetype)modelLayer;
2.2 Property methods
  • defaultValueForKey
+ (nullable id)defaultValueForKey:(NSString *)key;

通过layer的属性的key去layer属性的value。

我看网上有人通过复写此方法来实现在子layer中设置默认的属性,例如:

+ (nullable id)defaultValueForKey:(NSString *)key {
    if ([key isEqualToString:@"backgroundColor"]) {
        return (id)[UIColor blackColor].CGColor;
    }
    if ([key isEqualToString:@"cornerRadius"]) {
        return @20.0;
    }
    // 这么说来,像borderWidth、borderColor这些CALayer的属性都可以通过复写来实现自定义的设置。
    
    return [super defaultValueForKey:key];
}

我们还可以直接通过key来去读取属性的默认设置值。

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

Method for subclasses to override,

在子类中复写此方法,返回YES的话重新绘制layer?

当我们改变某个layer的属性值得时候,此方法就会被执行,通过复写此方法在里面判断并返回是否需要重新绘制视图。

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

当layer类使用 -encodeWithCoder 方法的时候会执行此方法。也就是说如果要归档一样layer的话,复写此类方法,可以设置哪些属性不被归档。

returns false if the named property should not be archived。

如果返回NO的话,这个key对应的属性不会被归档。

+ (nullable id)shouldArchiveValueForKey:(NSString *)key {
    // backgroundColor属性不会被归档
    if ([key isEqualToString:@"backgroundColor"]) {
        return NO;
    }
    
    return [super shouldArchiveValueForKey:key];
}

这个有什么实际用途吗在开发中,有没有什么实用场景呢?

2.3 Geometry and layer hierarchy properties

以下这些属性都是可以做动画的

@property CGRect bounds;
@property CGRect position;
@property CGFloat zPosition;
@property CGPoint anchorPoint;
@property CGFloat anchorPointZ;
@property CATransform3D transform;

transform的便捷构造方法

- (CGAffineTransform)affineTransform;
- (void)setAffineTransform:(CGAffineTransform)m;

Animatable是可以做动画的

// When setting the frame the `position'
 * and `bounds.size' are changed to match the given frame.Animatable
@property CGRect frame;

// When true the layer and its sublayers are not displayed. Defaults to NO
@property(getter=isHidden) BOOL hidden;

// When false layers facing away from the viewer are hidden from view.
 * Defaults to YES. Animatable.
@property(getter=isDoubleSided) BOOL doubleSided;

// ?
@property(getter=isGeometryFlipped) BOOL geometryFlippGeometry and layer hierarchy propertiesed;

// 返回一个布尔值,指示渲染时图层内容是否隐式翻转。
- (BOOL)contentsAreFlipped;

@property(nullable, readonly) CALayer *superlayer;
- (void)removeFromSuperlayer;
@property(nullable, copy) NSArray<__kindof CALayer *> *sublayers;
- (void)addSublayer:(CALayer *)layer;
- (void)insertSublayer:(CALayer *)layer atIndex:(unsigned)idx;
- (void)insertSublayer:(CALayer *)layer below:(nullable CALayer *)sibling;
- (void)insertSublayer:(CALayer *)layer above:(nullable CALayer *)sibling;
- (void)replaceSublayer:(CALayer *)oldLayer with:(CALayer *)newLayer;
- (void)replaceSublayer:(CALayer *)oldLayer with:(CALayer *)newLayer;
@property CATransform3D sublayerTransform;
@property(nullable, strong) __kindof CALayer *mask;
@property BOOL masksToBounds;

3. 略…

… 先过一遍,用的时候再看。

七、CALayer的子类

子类作用
CAEAGLayer用OpenGL ES绘制的层,注意iOS12 OpenGLES is deprecated
CAEmitterLayer发射器层,用来控制粒子效果
CAGradientLayer梯度层,颜色渐变
CAReplicatorLayer用来自动复制sublayer
CAScrollLayer用来管理可滑动的
CAShapeLayer绘制立体的贝塞尔曲线,圆角什么的
CATextLayer可以绘制string或AttributeString
CATiledLayer用来管理一副可以被分割的大图
CATransformLayer用来渲染3D layer的层次结构
AVPlayerLayer播放器视图层
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值