CALayer-2

CAScrollLayer

功能简介

  • CAScrollLayer显示一部分可滚动图层,该图层十分基础,无法直接响应用户的触摸操作,也不能直接检查可滚动图层的边界,故可避免越界无限滚动。

  • UIScrollView用的不是CAScrollLayer,而是直接改动图层边界。

  • CAScrollLayer的滚动模式可设为水平、垂直或者二维

    //设置滚动模式
    scrollingViewLayer.scrollMode = kCAScrollBoth
    

以下经验规律用于决定是否使用CAScrollLayer:

  • 如果想使用轻量级的对象,只需用代码操作滚动:可以考CAScrollLayer。
  • 如果想让用户操作滚动,UIScrollView大概是更好的选择。
  • 如果是滚动大型图片:考虑使用CATiledLayer

CATextLayer

功能简介

  • CATextLayer能够对普通文本或属性字串进行简单快速的渲染。
  • 与UILabel不同,CATextLayer无法指定UIFont,只能使用CTFontRef或CGFontRef。
  • 像下面这样的代码完全可以掌控文本的字体、字体大小、颜色、对齐、折行(wrap)和截断(truncation)规则,也有动画效果:

代码示例

    func setUpLayer(){
        // 1
        let textLayer = CATextLayer()
        textLayer.frame = someView.bounds

        // 2
        var string = ""
        for _ in 1...20 {
        string += "Lorem ipsum dolor sit amet"
        }

        textLayer.string = string

        // 创建一个字体,赋给文本图层
        let fontName: CFStringRef = "Noteworthy-Light"
        textLayer.font = CTFontCreateWithName(fontName, fontSize, nil)

        // 4
        textLayer.foregroundColor = UIColor.darkGrayColor().CGColor
        //将文本图层设为折行
        textLayer.wrapped = true
        //左对齐
        textLayer.alignmentMode = kCAAlignmentLeft
        //按屏幕设置contentsScale属性
        textLayer.contentsScale = UIScreen.mainScreen().scale
        //设置截断属性
        textLayer.truncation
        someView.layer.addSublayer(textLayer)

    }

注意事项: 所有图层类的渲染缩放系数都默认为1。在添加到视图时,图层自身的contentsScale缩放系数会自动调整,适应当前画面。你需要为手动创建的图层明确指定contentsScale属性,否则默认的缩放系数1会在Retina显示屏上产生部分模糊。

CAGradientLayer

功能简介

  • CAGradientLayer简化了混合两种或更多颜色的工作,尤其适用于背景。要配置渐变色,你需要分配一个CGColor数组,以及标识渐变图层起止点的startPoint和endPoint。

注意:startPoint和endPoint并不是明确的点,而是用单位坐标空间定义,在绘制时映射到图层边界。也就是说x值为1表示点在图层右边缘,y值为1表示点在图层下边缘。

属性介绍

  • CAGradientLayer包含type属性,虽说该属性只有kCAGradientLayerAxial一个选择,由数组中的各颜色产生线性过渡渐变。
  • 具体含义是渐变过渡沿startPointendPoint的向量A方向产生,设B与A垂直,则各条B平行线上的所有点颜色相同。
  • locations属性可以使用一个数组(元素取值范围0到1),指定渐变图层参照colors顺序取用下一个过渡点颜色的位置。
  • 未设定时默认会平均分配过渡点。一旦设定就必须与colors的数量保持一致,否则会出错。

代码示例

    func setUpLayer(){
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = someView.bounds
        //指定颜色数组
        gradientLayer.colors = [cgColorForRed(209.0, green: 0.0, blue: 0.0),
        cgColorForRed(255.0, green: 102.0, blue: 34.0),
        cgColorForRed(255.0, green: 218.0, blue: 33.0),
        cgColorForRed(51.0, green: 221.0, blue: 0.0),
        cgColorForRed(17.0, green: 51.0, blue: 204.0),
        cgColorForRed(34.0, green: 0.0, blue: 102.0),
        cgColorForRed(51.0, green: 0.0, blue: 68.0)]
        //设置起点
        gradientLayer.startPoint = CGPoint(x: 0, y: 0)
        //设置止点
        gradientLayer.endPoint = CGPoint(x: 0, y: 1)
        someView.layer.addSublayer(gradientLayer)
    }
    func cgColorForRed(red: CGFloat, green: CGFloat, blue: CGFloat) -> AnyObject {
        return UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: 1.0).CGColor as AnyObject
    }

CAReplicatorLayer

功能简介

  • CAReplicatorLayer能够以特定次数复制图层
  • 每个图层复件的颜色和位置都可以改动,而且可以在总复制图层之后延迟绘制,营造一种动画效果。
  • 还可以利用深度,创造三维效果。

代码示例

    func setUpLayer(){
        // 1
        let replicatorLayer = CAReplicatorLayer()
        replicatorLayer.frame = someView.bounds

        // 2
        //设制图层数instanceCount
        replicatorLayer.instanceCount = 30
        //设置绘制延迟
        replicatorLayer.instanceDelay = CFTimeInterval(1 / 30.0)
        //设图层为2D
        replicatorLayer.preservesDepth = false
        //实例颜色为白色
        replicatorLayer.instanceColor = UIColor.whiteColor().CGColor

        // 3、为陆续的实例复件设置RGB颜色偏差值(默认为0,即所有复件保持颜色不变)
              这里实例初始颜色为白色,即RGB都为1.0,所以偏差值设红色为0,绿色和蓝色为相同负数会使其逐渐现出红色
        replicatorLayer.instanceRedOffset = 0.0
        replicatorLayer.instanceGreenOffset = -0.5
        replicatorLayer.instanceBlueOffset = -0.5
        //alpha透明度偏差值的变化也与此类似,针对陆续的实例复件
        replicatorLayer.instanceAlphaOffset = 0.0

        // 4、创建旋转变换,使得实例复件按一个圆排列
        let angle = Float(M_PI * 2.0) / 30
        replicatorLayer.instanceTransform = CATransform3DMakeRotation(CGFloat(angle), 0.0, 0.0, 1.0)
        someView.layer.addSublayer(replicatorLayer)

        // 5、创建供复制图层使用的实例图层,设置框架,使第一个实例在someView边界顶端水平中心处绘制,另外设置实例颜色,把实例图层添加到复制图层。
        let instanceLayer = CALayer()
        let layerWidth: CGFloat = 10.0
        let midX = CGRectGetMidX(someView.bounds) - layerWidth / 2.0
        instanceLayer.frame = CGRect(x: midX, y: 0.0, width: layerWidth, height: layerWidth * 3.0)
        instanceLayer.backgroundColor = UIColor.whiteColor().CGColor
        replicatorLayer.addSublayer(instanceLayer)

        // 6、创建一个透明度由1(不透明)过渡为0(透明)的淡出动画。
        let fadeAnimation = CABasicAnimation(keyPath: "opacity")
        fadeAnimation.fromValue = 1.0
        fadeAnimation.toValue = 0.0
        fadeAnimation.duration = 1
        fadeAnimation.repeatCount = Float(Int.max)

        // 7、设实例图层透明度为0,使得每个实例在绘制和改变颜色与alpha前保持透明
        instanceLayer.opacity = 0.0
        instanceLayer.addAnimation(fadeAnimation, forKey: "FadeAnimation")
    }

你可能感兴趣的:(CoreAnimation,动画,CALayer)