目录
1. CAReplicatorLayer 复制动画
2. CAShapeLayer 路径动画
从个人笔记中摘录而来。时间间隔长了点,可能有部分失误。谨作为个人网上笔记。
不适合他人阅读。
前言
1. CAReplicatorLayer 复制动画
CAReplicatorLayer:一个用于动画的Layer容器,存放若干份复制的子Layer。
- 属性
配置子Layer的:复制个数、延迟时间、形变、颜色、透明度等
CAReplicatorLayer : CALayer
// 是否开启景深
@property BOOL preservesDepth;
// 要拷贝的个数(默认为1)
@property NSInteger instanceCount;
// 间隔时间(延迟时间)
@property CFTimeInterval instanceDelay;
// 背景色,如果设置了backgroundColor则此属性失效
@property(nullable) CGColorRef instanceColor;
// 形变
@property CATransform3D instanceTransform;
// 颜色偏移(为负则递减)
@property float instanceRedOffset;
@property float instanceGreenOffset;
@property float instanceBlueOffset;
// 透明度偏移(为负则递减)
@property float instanceAlphaOffset;
运行效果
- 使用
第一步:创建CAReplicatorLayer对象(负责配置)
CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
[replicatorLayer setInstanceCount:8];
[replicatorLayer setInstanceTransform:CATransform3DMakeTranslation(50, 0, 0)];
[replicatorLayer setInstanceDelay:0.15];
[replicatorLayer setInstanceColor:[UIColor blueColor].CGColor];
[replicatorLayer setInstanceAlphaOffset:-0.1];
第二步:创建一个图层对象(子Layer)
CALayer *layer=[CALayer layer]; // 这里可以是某个View的layer
[layer setBounds:CGRectMake(0, 0, 20, 100)]; // 大小
[layer setBackgroundColor:[UIColor greenColor].CGColor]; // 会和replicatorLayer的InstanceColor混合
[layer setPosition:CGPointMake(50, 300)]; // 第一个子layer的位置
[layer setAnchorPoint:CGPointMake(0, 1)]; // 锚点
第三步:创建一个基本动画(子Layer设置Animation)
CABasicAnimation *scaleAnimation=[CABasicAnimation animation];
[scaleAnimation setRepeatCount:MAXFLOAT];
[scaleAnimation setKeyPath:@"transform.scale.y"];
[scaleAnimation setToValue:@(0.1)];
[scaleAnimation setDuration:0.5];
[scaleAnimation setAutoreverses:true]; // 形变完成后动画返回原状态
[layer addAnimation:scaleAnimation forKey:@"hello"];
第四步:子Layer添加到CAReplicatorLayer中
[replicatorLayer addSublayer:layer];
[self.view.layer addSublayer:replicatorLayer];
2. CAShapeLayer 路径动画
需要配合贝塞尔曲线(提供路径/形状)
- 属性
CAShapeLayer : CALayer
// 路径(用于渲染)(必填)
@property(nullable) CGPathRef path;
// 填充色(默认:黑色)
@property(nullable) CGColorRef fillColor;
// kCAFillRuleNonZero(默认)、kCAFillRuleEvenOdd
@property(copy) CAShapeLayerFillRule fillRule;
// 边框色(默认:nil)
@property(nullable) CGColorRef strokeColor;
// 边框线宽(默认:1)
@property CGFloat lineWidth;
// 线两端(kCALineCapButt(默认)、kCALineCapRound、kCALineCapSquare)
@property(copy) CAShapeLayerLineCap lineCap;
// 线连接处(kCALineJoinMiter(默认)、kCALineJoinRound、kCALineJoinBevel)
@property(copy) CAShapeLayerLineJoin lineJoin;
// 边框线的起始、结束位置[0,1]
@property CGFloat strokeStart; // 默认:0
@property CGFloat strokeEnd; // 默认:1
// 默认:nil
@property(nullable, copy) NSArray<NSNumber *> *lineDashPattern;
// 默认:0
@property CGFloat lineDashPhase;
// 斜接,默认:10
@property CGFloat miterLimit;
- 使用
第一步:创建UIBezierPath
CGPoint startPoint=CGPointMake(0, 300);
CGPoint endPoint=CGPointMake(300, 300);
CGPoint controlPoint1=CGPointMake(50, 40);
CGPoint controlPoint2=CGPointMake(100, 500);
UIBezierPath *path=[UIBezierPath new];
[path moveToPoint:startPoint];
[path addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];
[path addLineToPoint:controlPoint2];
第二步:创建CAShapeLayer(设置path,并添加到父Layer中)
CAShapeLayer *progressLineLayer=[CAShapeLayer layer];
[progressLineLayer setPath:path.CGPath];
[progressLineLayer setStrokeColor:[UIColor orangeColor].CGColor];
[progressLineLayer setFillColor:[UIColor redColor].CGColor];
[progressLineLayer setLineWidth:5.0];
[progressLineLayer setLineCap:kCALineCapRound]; //
[progressLineLayer setLineJoin:kCALineJoinRound]; //
[progressLineLayer setStrokeStart:0.2];
[self.view.layer addSublayer:progressLineLayer];
运行效果
网友评论