CoreAnimation 之CAReplicatorLayer

CAReplicatorLayer:

主要作用有以下两个:

  • CAReplicatorLayer的目的是为了高效生成许多相似的图层,它会绘制一个或多个图层的子图层 并在每个复制体上应用不同的变换
  • 使用CAReplicatorLayer的其中一个实际应用:反射 使用CAReplicatorLayer并应用一个负比例变换于一个复制图层 你就可以创建指定视图内容的镜像图片 这样就创建了一个实时的反射效果

首先看第一个的代码示例:

/*        创建一个模板层 CAReplicatorLayer会按照一定的规则“克隆”这个模板         */
    CAShapeLayer *shape = [CAShapeLayer layer];
    shape.frame = CGRectMake(0, 0, 80, 80);
    /*        绘制模板的形状         */
    shape.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 80, 80)].CGPath;
    /*        模板的填充颜色         */
    shape.fillColor = [UIColor redColor].CGColor;
    shape.opacity = 0.0;
    /*        创建所有的子层的动画组(也可以是单个动画)         */
    CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
    /*        动画组元素         */
    animationGroup.animations = @[[self alphaAnimation],[self scaleAnimation]];
    /*        动画执行时间         */
    animationGroup.duration = 4.0;
    animationGroup.autoreverses = NO;
    animationGroup.repeatCount = HUGE;
    /*        给模板层添加动画 实质上也是给每个CAReplicatorLayer子层添加动画         */
    [shape addAnimation:animationGroup forKey:@"animationGroup"];
    /*        创建CAReplicatorLayer对象         */
    CAReplicatorLayer *replicatorLayer = [CAReplicatorLayer layer];
    replicatorLayer.frame = self.containerView.bounds;
    /*        设置每个元素的添加间隔时间         */
    replicatorLayer.instanceDelay = 0.5;
    /*        设置每元素个数         */
    replicatorLayer.instanceCount = 8;

  /*        给CAReplicatorLayer对象的子层添加转换规则 这里决定了子层的布局         */
    replicatorLayerY.instanceTransform = CATransform3DTranslate(CATransform3DIdentity, 0, radius+between, 0);

/*        添加子层         */
    [replicatorLayer addSublayer:shape];

在这里,大家可以根据需要添加不同的动画元素或者不添加任何动画,该用法多用于实现加载提示视图的动画制作。

第二个用法,实现某个视图的反射效果:

  我们首先继承UIView创建一个子类,在子类的+(Class)layerClass方法中设置当前视图对象的layer为CAReplicatorLayer对象:

+(Class)layerClass{
    return [CAReplicatorLayer class];
}

然后在创建该子类的对象时对self.layer进行设置相关参数:

- (void)setup{
    /*        获取当前的layer 实际上为CAReplicatorLayer对象         */
    CAReplicatorLayer *layer = (CAReplicatorLayer *)self.layer;
    layer.instanceCount = 2;
    layer.anchorPoint = CGPointMake(0.5, 0.5);

    /*        创建3D转换效果         */
    CATransform3D transform = CATransform3DIdentity;
    CGFloat verticaloffset = self.bounds.size.height  ;
    transform = CATransform3DTranslate(transform, 0, verticaloffset, 0);

    /*        设置Y轴镜面反射         */
    transform = CATransform3DScale(transform, 1, -1, 0);
    transform = CATransform3DRotate(transform, -M_PI / 4, 1, 0, 0);
    layer.instanceTransform  = transform;
    /*        镜面的透明度 越低显示越清晰 因为是镜面效果         */
    layer.instanceAlphaOffset = -0.1;
}

效果图如下

时间: 2024-10-26 09:17:06

CoreAnimation 之CAReplicatorLayer的相关文章

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析

iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CAShapeLayer 五.CATextLayer iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer CAEmitterLayer是CoreAnimation框架中的粒子发射层,在以前的一片博客中有详细的介绍和范例,这里不再重复,地址如下: 粒

iOS开发CoreAnimation解读之二——对CALayer的分析

iOS开发CoreAnimation解读之二——对CALayer的分析 一.UIView中的CALayer属性 1.Layer专门负责view的视图渲染 2.自定义view默认layer属性的类 二.几种系统的Layer类 1.CAEmitterLayer 2.CAGradientLayer 3.CAEAGLLayer 4.CAReplicatorLayer 5.CAScrollLayer 6.CAShapeLayer 7.CATextLayer 8.CATiledLayer 9.CATrans

CoreAnimation汇总

CoreAnimation 字数2340 阅读8068 评论4 喜欢68 Core Animation是直接作用在CALayer上的(并非UIView上)非常强大的跨Mac OS X和iOS平台的动画处理API,Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程. 核心动画继承结构 核心动画继承结构 注意:核心动画中的虚类不能使用,而应该使用他们子类中的实类. Core Animation的使用步骤 如果是Xcode6之前的版本,要导入<QuartzCore/Quartz

第二十九篇、CoreAnimation的使用

使用的的三个步骤 1.初始化演员 2.设置好剧情 3.播放 附录:一个把商品添加到购物车的抛物线动画 coreAnimation // 1.初始化演员 CALayer *layer = [[CALayer alloc]init]; layer.bounds = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); layer.position = C

CoreAnimation 之CATextLayer

如果你想在一个图层中显示文字,完全可以借助图层代理直接将Core Graphics写入图层的内容(这就是UILabel的精髓).如果雨果寄宿于图层的视图,直接在图层上操作,其实相当繁琐.你要为每一个显示文字的图层创建一个能像图层代理一样工作的类,还要在逻辑上判断哪个图层需要显示哪个字符串,更别提还要记录不同的字体,颜色等等的属性. 万幸的是这是都是多余的,在CoreAnimation为我们提供了一个CALayer的子类CATextLayer,它以图层的形式包含了UILabel几乎所有的绘制特效,

GIF动画,菊花动画,UIView动画,CoreAnimation动画(CALayer动画)的用法

1.GIF动画 1 // 创建一个显示图片的imageView // viewController创建 2 UIImageView *showGifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 414, 736)]; 3 [self.view addSubview:showGifImageView]; 4 5 6 //创建一个存储图片的数组 7 NSMutableArray *saveImageViewArray

IOS CoreAnimation

@property (weak, nonatomic) IBOutlet UIView *redView;@property (weak, nonatomic) IBOutlet UILabel *label; #pragma mark - CoreAnimation //基础动画 - (IBAction)CABasicAnimation:(UIButton *)sender { //参数需要是layer的属性,或者是属性的属性的名字 CABasicAnimation *basic = [CAB

CoreAnimation

CoreAnimation 是一个抽象类,是所有动画的底层实现.系统提供了以下几个子类: CABasicAnimation 基础动画 ,对属性的变化作动画,只做一次动画: CAKeyframeAnimation CAAnimationGroup  CATransitoin 转场动画页面切换效果动画 CASpringAnimation 弹性动画 抖动效果 achorPoint 视图上的某一点,默认为0.5 0.5   大小为0-1之间 position 以父视图0 0为原点,确定的achorpoi

iOS关于CoreAnimation动画知识总结

一:UIKit动画 在介绍CoreAnimation动画前先简单介绍一下UIKit动画,大部分简单的动画都可以使用UIKit动画实现,如果想实现更复杂的效果,则需要使用Core Animation了:UIKit动画有两种写法:它不仅可以针对视图还可以针对其它控件: 1:第一种写法是利用属性,结合beginAnimations.commitAnimations -(void)animationOfUIKit { UIView *redView=[[UIView alloc]initWithFram