码迷,mamicode.com
首页 > 其他好文 > 详细

CALayer

时间:2015-07-19 10:19:12      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:calayer   ios   ios图层   图层动画   uiview   

CALayer

标签(空格分隔): ios进阶


CALayer

CALayer的基本介绍

  • 在iOS中,你能看得见摸得着的东西基本上都是UIView,其实UIView之所以能显示在屏幕上,完全是因为它内部的一个图层,在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层
    @property(nonatomic,readonly,retain) CALayer *layer;
    当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示
    UIView本身不具备显示的功能,是它内部的图层(CALayer对象)才有显示功能

CALayer的基本属性

  • 宽度和高度
    @property CGRect bounds;

  • 位置(相对于父控件的坐标系)
    @property CGPoint position;

  • 锚点(x,y的范围都是0-1,是相对于自己的坐标系,(1,1)是指的自己的右下角)
    @property CGPoint anchorPoint;

  • 背景颜色(CGColorRef类型)
    @property CGColorRef backgroundColor;

  • 形变属性
    @property CATransform3D transform;

  • 边框颜色(CGColorRef类型)
    @property CGColorRef borderColor;

  • 边框宽度
    @property CGFloat borderWidth;

  • 圆角半径
    @property CGColorRef borderColor;

  • 内容(比如设置为图片CGImageRef)
    @property(retain) id contents;

注意点

  • CALayer是定义在QuartzCore框架中的,CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的, UIColor、UIImage是定义在UIKit框架中的
  • QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用
    但是UIKit只能在iOS中使用
  • 为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef

隐式动画

  • 每一个UIView内部都默认关联着一个CALayer,我们可用称这个Layer为Root Layer(根层)
  • 所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画
  • 当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果。
  • 可以通过动画事务(CATransaction)关闭默认的隐式动画效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];

CALayer上动画的暂停和恢复

#pragma mark 暂停CALayer的动画
-(void)pauseLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];

    // 让CALayer的时间停止走动
      layer.speed = 0.0;
    // 让CALayer的时间停留在pausedTime这个时刻
    layer.timeOffset = pausedTime;
}
#pragma mark 恢复CALayer的动画
-(void)resumeLayer:(CALayer*)layer
{
    CFTimeInterval pausedTime = layer.timeOffset;
    // 1. 让CALayer的时间继续行走
      layer.speed = 1.0;
    // 2. 取消上次记录的停留时刻
      layer.timeOffset = 0.0;
    // 3. 取消上次设置的时间
      layer.beginTime = 0.0;    
    // 4. 计算暂停的时间(这里也可以用CACurrentMediaTime()-pausedTime)
    CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    // 5. 设置相对于父坐标系的开始时间(往后退timeSincePause)
      layer.beginTime = timeSincePause;

选择

CALayer和UIView都能实现动画效果,但 UIView多了事件处理的功能,所以当需要与用户进行交互的时候就需要用UIView了,如果不需要交互的话,那两者都可以,单CALayer更轻量级,性能会好些

几种常见的CALayer类型

做动画的时候可能会用到

CAShapeLayer(形状图层)

做路径动画的时候可能用到
- 代码示例(描边动画)

   - (void)start
{
    // 生成形状图层
    CAShapeLayer *shapeL = [CAShapeLayer layer];
    shapeL.path = self.path.CGPath;
    shapeL.strokeColor = [UIColor redColor].CGColor;
    // 默认会添加整个路径,如果想要画线,必须清空填充的颜色
    shapeL.fillColor = [UIColor clearColor].CGColor;
//    // 设置描边的进度
//    shapeL.strokeStart = 0;
//    shapeL.strokeEnd = 0.5;

    [self.layer addSublayer:shapeL];

    // 清空绘图
    [self.path removeAllPoints];
    [self setNeedsDisplay];

    CABasicAnimation *anim = [CABasicAnimation animation];
    anim.duration = 3;
    anim.keyPath = @"strokeEnd";
    anim.fromValue = @0;
    anim.toValue = @1;
    [shapeL addAnimation:anim forKey:nil];
}

CAGradientLayer(渐变图层)

  • 可以绘制出渐变效果
  • 常见属性:
    • 颜色渐变的数组
      @property(copy) NSArray *colors
    • 渐变颜色的区间分布,locations的数组长度和color一致,这个值一般不用管它,默认是nil,会平均分布。
      @property(copy) NSArray *locations
    • 映射locations中第一个位置,用单位向量表示,比如(0,0)表示从左上角开始变化。默认值是(0.5,0.0)。
      @property CGPoint startPoint
    • 映射locations中最后一个位置,用单位向量表示,比如(1,1)表示到右下角变化结束。默认值是(0.5,1.0)。
      @property CGPoint endPoint
      默认值是kCAGradientLayerAxial,表示按像素均匀变化。除了默认值也无其它选项。
      @property(copy) NSString *type

CAReplicatorLayer(复制图层)

  • 常见属性
    • instanceCount 子层总数
    • instancziceeDelay 每个子层延迟
    • instanceTransform 每个子层相对偏移
    • instanceColor;颜色

利用CAReplicatorLayer可做很多绚丽的效果,如音乐条,和活动指示器
技术分享

技术分享

版权声明:本文为博主原创文章,未经博主允许不得转载。

CALayer

标签:calayer   ios   ios图层   图层动画   uiview   

原文地址:http://blog.csdn.net/maomaopanjiu/article/details/46945167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!