CAReplicatorLayer(復(fù)制層)
CAReplicatorLayer所有獨有屬性
//復(fù)制實例數(shù)量(以加入到復(fù)制層的所有被復(fù)制對象組為一份)
@property NSInteger instanceCount;
//默認為NO多律,如果YES,使其實例遵守相同的限制
@property BOOL preservesDepth;
//延遲xx秒復(fù)制下一份實例
@property CFTimeInterval instanceDelay;
//實例間形變
@property CATransform3D instanceTransform;
//實例顏色贞让,用處不大(被復(fù)制對象設(shè)置自身顏色即可)
@property(nullable) CGColorRef instanceColor;
//設(shè)置倒影屬性
@property float instanceRedOffset;
@property float instanceGreenOffset;
@property float instanceBlueOffset;
@property float instanceAlphaOffset;
CAReplicatorLayer實現(xiàn)音量振動條
- 實現(xiàn)方法步驟:
- 首先設(shè)置一個音量振動條
- 為音量振動條增加不斷伸縮的動畫
- 將音量振動條加入到復(fù)制層中帘饶,設(shè)置復(fù)制層屬性绰精,復(fù)制一定數(shù)量的形變等不一的音量振動條撒璧,形成先后的感覺(注意要將復(fù)制層加入到UIView的layer層中,并設(shè)置frame)
// 復(fù)制層
// 復(fù)制層工作原理:它只會復(fù)制它的子層
CAReplicatorLayer *repLayer = [CAReplicatorLayer layer];
repLayer.frame = _contentView.bounds;
// 復(fù)制instanceCount - 1份
// 設(shè)置復(fù)制層里面的總份數(shù)
repLayer.instanceCount = 5;
// 設(shè)置復(fù)制層的形變,都是相對于上一個
repLayer.instanceTransform = CATransform3DMakeTranslation(40, 0, 0);
// 設(shè)置復(fù)制層動畫延遲時間,也是相對于上一個
repLayer.instanceDelay = 0.3;
// repLayer.instanceAlphaOffset -= 0.3;
[_contentView.layer addSublayer:repLayer];
// 添加音量振動條
CALayer *redLayer = [CALayer layer];
// redLayer.frame = CGRectMake(0, 100, 30, 100);
redLayer.anchorPoint = CGPointMake(0, 1);
redLayer.position = CGPointMake(0, 200);
redLayer.bounds = CGRectMake(0, 0, 30, 100);
redLayer.backgroundColor = [UIColor redColor].CGColor;
[repLayer addSublayer:redLayer];
// 添加動畫
CABasicAnimation *anim = [CABasicAnimation animation];
// 修改Layer的哪個屬性
anim.keyPath = @"transform.scale.y";
// 設(shè)置修改的值
anim.toValue = @0;
anim.repeatCount = MAXFLOAT;
anim.duration = .5;
// 動畫反轉(zhuǎn)
anim.autoreverses = YES;
[redLayer addAnimation:anim forKey:nil];
CAReplicatorLayer實現(xiàn)活動指示器(效果是綠色點在圓中有規(guī)律的“此起彼伏”)
- 實現(xiàn)方案一步驟(難點是想到粒子是伸縮而不是旋轉(zhuǎn)):
- 首先設(shè)置一個矩形粒子
- 為矩形粒子增加不斷伸縮的動畫(注意初始化伸縮為0)
- 將矩形粒子加入到復(fù)制層中笨使,設(shè)置復(fù)制層屬性卿樱,復(fù)制一定數(shù)量的形變等不一的矩形粒子,形成先后的感覺(注意要將復(fù)制層加入到UIView的layer層中硫椰,并設(shè)置frame)
// 復(fù)制層
CAReplicatorLayer *repLayer = [CAReplicatorLayer layer];
repLayer.frame = _contentView.bounds;
int count = 20;
// 設(shè)置總分數(shù)
repLayer.instanceCount = count;
// 計算每個小塊的占用的度數(shù)
CGFloat angle = M_PI * 2 / count;
repLayer.instanceTransform = CATransform3DMakeRotation(angle, 0, 0, 1);
// 設(shè)置動畫延長時間 = 動畫時長 / 總個數(shù)
repLayer.instanceDelay = 1.0 / count;
[_contentView.layer addSublayer:repLayer];
// 添加綠色塊,到復(fù)制層
CALayer *greenDot = [CALayer layer];
greenDot.transform = CATransform3DMakeScale(0, 0, 0);//使所有粒子一開始不是都一同展示到屏幕中
greenDot.frame = CGRectMake(70, 10, 10, 10);
greenDot.backgroundColor = [UIColor greenColor].CGColor;
[repLayer addSublayer:greenDot];
// 添加動畫
CABasicAnimation *anim = [CABasicAnimation animation];
anim.keyPath = @"transform.scale";
anim.fromValue = @1;//使所有粒子一開始不是都一同展示到屏幕中
anim.toValue = @0;
anim.repeatCount = MAXFLOAT;
anim.duration = 1;
[greenDot addAnimation:anim forKey:nil];
CAReplicatorLayer實現(xiàn)倒影(效果像是水中倒影)
//需要修改控制器的view的圖層是復(fù)制層,才能復(fù)制UIImageView
###在VCView.m中
// 設(shè)置當(dāng)前view的圖層類型
+ (Class)layerClass
{
return [CAReplicatorLayer class];
}
###vc.m中viewDidLoad方法:
// 復(fù)制圖片
CAReplicatorLayer *repL = (CAReplicatorLayer *)self.view.layer;
repL.instanceCount = 2;
// 旋轉(zhuǎn),繞著父層的錨點旋轉(zhuǎn)(圖片層的錨點必須在中心點才能實現(xiàn)效果)
repL.instanceTransform = CATransform3DMakeRotation(M_PI, 1, 0, 0);
##核心代碼
// 倒影
repL.instanceRedOffset -= 0.1;
repL.instanceGreenOffset -= 0.1;
repL.instanceBlueOffset -= 0.1;
repL.instanceAlphaOffset -= 0.1;