CALayer的"自动布局"

用过CALayer及其子类的都知道这玩意功能特别强大,效果优美,占用内存小等.
但是,最恶心的事情就是使用的时候需要算frame…

自动布局只支持UIView及其子类.那么.我们怎么让Layer有这个特性呢.
首先,我们要知道

1.UIView上头有一个Layer.
2.Layer添加的方式类似UIView:`layer addSubLayer`.
3.一个Application至少有一个UIView(UIWindow).

我们打印一下UIView对象的layer发现其是CALayer的实例.那么,UIView的Layer就是CALayer.我们知道UIView是支持自动布局的,那么将UIView创建Layer的方法重写不久可以使其支持对应Layer的自动布局了么

/// apple文档说明
This method returns the CALayer class object by default. Subclasses can override this method and return a different layer class as needed. For example, if your view uses tiling to display a large scrollable area, you might want to override this property and return the CATiledLayer class, as shown in Listing 1.

下面用CAGradientLayer来举个例子,创建一个支持自动布局的渐变View.

///在GradientLayerView.m中重写如下方法
+ (Class)layerClass {
    return [CAGradientLayer class];
}

使用的时候就是

GradientLayerView *gradientView = [GradientLayerView new];
(CAGradientLayer)gradientView.layer.startPoint = CGPoint(x ,y);
......

看起来貌似有点不方便

//.h
@interface CHGradientLayerView : UIView
@property (nonatomic, nullable, copy) NSArray *colors;
@property (nonatomic, nullable, copy) NSArray<NSNumber *> *locations;
@property (nonatomic, assign) CGPoint startPoint;
@property (nonatomic, assign) CGPoint endPoint;
@property (nonatomic ,copy) CAGradientLayerType type;
@end
//.m
@implementation CHGradientLayerView
#pragma mark getter
+ (Class)layerClass {
    return [CAGradientLayer class];
}
- (NSArray *)colors {
    return ((CAGradientLayer *)self.layer).colors;
}
- (NSArray<NSNumber *> *)locations {
    return ((CAGradientLayer *)self.layer).locations;
}
- (CGPoint)startPoint {
    return ((CAGradientLayer *)self.layer).startPoint;
}
- (CGPoint)endPoint {
    return ((CAGradientLayer *)self.layer).endPoint;
}
- (CAGradientLayerType)type {
    return ((CAGradientLayer *)self.layer).type;
}
#pragma mark setter
- (void)setColors:(NSArray *)colors {
    ((CAGradientLayer *)self.layer).colors = colors;
}
- (void)setLocations:(NSArray<NSNumber *> *)locations {
    ((CAGradientLayer *)self.layer).locations = locations;
}
- (void)setStartPoint:(CGPoint)startPoint {
    ((CAGradientLayer *)self.layer).startPoint = startPoint;
}
- (void)setEndPoint:(CGPoint)endPoint {
    ((CAGradientLayer *)self.layer).endPoint = endPoint;
}
- (void)setType:(CAGradientLayerType)type {
    ((CAGradientLayer *)self.layer).type = type;
}
@end

使用就变成了

GradientLayerView *gradientView = [GradientLayerView new];
gradientView.startPoint = CGPoint(x ,y);
......

layer的自动布局就可以随便用了.内存占用也不是很大.是不是很舒服.其他的CALayer的子类也可以这样修改为支持自动布局的LayerView.
CHLayeView-Demo

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值