CAReplicatorLayer的使用
CAReplicatorLayer可以创建layer的的指定份数的子层(源层),每个副本可能有应用于其的几何,时间和颜色转换。CAReplicatorLayer可以嵌套使用。
hitTest:目前仅测试z replicator层的子层的第一个实例。
1.设置实例显示属性:
instanceCount:要创建的副本数,包括源层。默认为1
instanceDelay:指定复制副本之间的延迟(以秒为单位)动画。
instanceTransform:应用于前一个实例以产生当前实例的变换矩阵动画。该变换矩阵被应用于实例k-1以产生实例k。 矩阵相对于该层的中心被施加。默认为单位矩阵。
2.修改实例层几何样式属性:
preservesDepth:定义该层是否将其子层平坦到其平面上。默认为NO。
3.访问实例颜色值属性:
instanceColor:定义用于指定源对象的颜色。Animatable。默认为不透明白色。
instanceRedOffset:定义添加到每个复制实例的颜色的红色分量的偏移量。Animatable。将instanceRedOffset添加到实例k-1的红色分量,以产生实例k的调制颜色。
instanceGreenOffset:定义添加到每个复制实例的颜色的绿色分量的偏移量。Animatable。将instanceGreenOffset添加到实例k-1的红色分量,以产生实例k的调制颜色。
instanceBlueOffset:略(同上)
instanceAlphaOffset:略(同上)
4.使用案例:
case1:
代码:
func animation_1(){
let lay = CAReplicatorLayer()
lay.bounds =CGRect(x:0, y:0, width:320, height:320)
lay.position =view.center
lay.backgroundColor =UIColor.clear.cgColor
view.layer.addSublayer(lay)
let redSquare = CALayer()
redSquare.backgroundColor =UIColor.white.cgColor
redSquare.frame =CGRect(x:0, y:0, width:40, height:40)
let instanceCount = 5
lay.instanceCount = instanceCount
lay.instanceTransform =CATransform3DMakeTranslation(50,0,0)
let offsetStep = -1 / Float(instanceCount)
lay.instanceBlueOffset = offsetStep
lay.instanceGreenOffset = offsetStep
lay.addSublayer(redSquare)
}
case 2:(嵌套)
代码:
func animation_2(){
let lay = CAReplicatorLayer()
lay.bounds =CGRect(x:0, y:0, width:320, height:320)
lay.position =view.center
lay.backgroundColor =UIColor.clear.cgColor
// view.layer.addSublayer(lay)
let redSquare = CALayer()
redSquare.backgroundColor =UIColor.white.cgColor
redSquare.frame =CGRect(x:0, y:0, width:40, height:40)
let instanceCount = 5
lay.instanceCount = instanceCount
lay.instanceTransform =CATransform3DMakeTranslation(50,0,0)
let offsetStep = -1 / Float(instanceCount)
lay.instanceBlueOffset = offsetStep
lay.instanceGreenOffset = offsetStep
lay.addSublayer(redSquare)
let outerReplicatorLayer = CAReplicatorLayer()
outerReplicatorLayer.addSublayer(lay)
outerReplicatorLayer.instanceCount =instanceCount
outerReplicatorLayer.instanceTransform =CATransform3DMakeTranslation(0,50,0)
outerReplicatorLayer.instanceRedOffset =offsetStep
view.layer.addSublayer(outerReplicatorLayer)
}
case 3:(圆点旋转动画)
代码:
func animation_2() {
//创建CAReplicatorLayer对象
let lay = CAReplicatorLayer();
lay.bounds =CGRect(x:0, y:0, width:150, height:150)
lay.cornerRadius =10
lay.backgroundColor =UIColor(white:0.0, alpha:0.3).cgColor
lay.position =view.center
view.layer.addSublayer(lay)
//创建单个点
let dot = CALayer()
dot.bounds =CGRect(x:0, y:0, width:15, height:15)
dot.position =CGPoint(x:lay.frame.size.width/2,y:20)
dot.backgroundColor =UIColor(white:0.8, alpha:1.0).cgColor
dot.backgroundColor =UIColor.white.cgColor
dot.cornerRadius = dot.frame.size.width/2
lay.addSublayer(dot)
//
let dot_num:Int = 15
lay.instanceCount = dot_num
let dot_angle = CGFloat(2*Double.pi)/CGFloat(dot_num)
lay.instanceTransform =CATransform3DMakeRotation(dot_angle,0,0,1.0)
let duration:CFTimeInterval = 1.5
let scale_animation = CABasicAnimation(keyPath:"transform.scale")
scale_animation.fromValue =1.0
scale_animation.toValue =0.1
scale_animation.duration = duration
scale_animation.repeatCount =Float.infinity
dot.add(scale_animation, forKey:nil)
lay.instanceDelay = duration/Double(dot_num)
dot.transform =CATransform3DMakeScale(0.01,0.01,0.01)
}
case 4:
代码:
func animation_4(){
let lay = CAReplicatorLayer()
lay.bounds =CGRect(x:0, y:0, width:60, height:60)
lay.position =view.center
lay.backgroundColor =UIColor.clear.cgColor
view.layer.addSublayer(lay)
let bar = CALayer()
bar.bounds =CGRect(x:0, y:0, width:8.0, height:40.0)
bar.position =CGPoint(x:10, y:75)
bar.cornerRadius =2.0
bar.backgroundColor =UIColor.red.cgColor
lay.addSublayer(bar)
let move = CABasicAnimation(keyPath: "position.y")
move.toValue = bar.position.y -35.0
move.duration =0.5
move.autoreverses =true
move.repeatCount =Float.infinity
bar.add(move, forKey:nil)
lay.instanceCount =3
lay.instanceDelay =0.33
lay.masksToBounds =true//裁剪掉超出边缘部分
lay.instanceTransform =CATransform3DMakeTranslation(10.0,0,0)//平移
}
注:如需了解更多请看官方文档:https://developer.apple.com/documentation/quartzcore/careplicatorlayer?preferredLanguage=occ#