用过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