zoukankan      html  css  js  c++  java
  • iOS:CALayer核心动画层

    CALayer:核心动画层


    简介:
    Core Animation 是跨平台的,支持iOS环境和Mac OS X环境
    学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView,而是CALayer
    CALayer是核心动画的基础,可以做圆角、阴影、边框等效果
    每个UIView内部都有一个Layer的属性
    在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图形硬件的操纵
     
    图层和视图之间的关系:
    •创建视图对象时,视图会自己创建一个层,视图在绘图(如drawRect:)时,会将内容画在自己的层上。当视图在层上完成绘图后,系统会将图层拷贝至屏幕。每个视图都有一个层,而每个图层又可以有多个子层
    •提示:
    1.Layer的设计目的不是为了取代视图,因此不能基于CALayer创建一个独立的可视化组件
    2.Layer的设计目的是提供视图的基本可视内容,从而提高动画的执行效率
    3.除提供可视内容外,Layer不负责视图的事件响应、内容绘制等工作,同时Layer不能参与到响应者链条中
     
    CALayer层次结构图:
     
    CALayer的使用说明:
    •通过UIView的layer属性可以拿到对应的根层,这个层不允许重新创建,但可以往层里面添加子层(调用CALayer的addSublayer)
    •要具体使用CALayer,需要引入<QuartzCore/QuartzCore.h>
    •获取当前图层或使用静态方法layer初始化CALayer后,可以设置以下属性:
    1.bounds:宽度和高度
    2.position:位置(默认指中心点,具体由anchorPoint决定)
    3.anchorPoint:锚点(x,y的范围都是0-1),决定了position的含义
    4.backgroundColor: 背景颜色(CGColorRef类型)
    5.borderColor:边框颜色(CGColorRef类型)
    6.borderWidth:边框宽度
    7.cornerRadius:圆角半径
    8.contents: 内容(比如设置为图片CGImageRef)
    9•transform:旋转、缩放、平移
    •注意:
    1.虽然CALayer可以使用frame,但最好还是使用bounds和position。为层设置动画时,用bounds和position会方便一点
    2.注意锚点和位置的关系,以及在旋转转换时对图层的影响
    3.UIView有一个addSubview方法,而layer有一个addSubLayer方法
     

     

    CALayer中图像及颜色的注意事项:
    •注意:
    –CALayer中使用CGColorRef和CGImageRef的数据类型,而不用UIColor和UIImage
    •原因:
    –QuartzCore(包含CALayer类)和Core Graphics(包含CGImageRef、CGColorRef)框架都能在iOS和Mac OS X上使用,但是UIKit(包含UIImage和其他UI开头的类)只能在iOS中使用
    –为了保证可移植性,QuartzCore不能使用UIImage,只能使用CGImageRef
    –不过很多情况下,可以通过UIKit对象的特定方法,可以得到Core Graphics对象,如UIImage的CGImage方法和UIColor的CGColor方法
     
     
    CALayer的隐式动画属性:
    •每一个UIView内部都默认关联着一个CALayer,称这个Layer为Root Layer。所有的非Root Layer都存在着隐式动画,隐式动画的默认时长为1/4秒。
    •当修改非Root Layer的部分属性时,相应的修改会自动产生动画效果,能执行隐式动画的属性被称为“可动画属性”,诸如:
    1.bounds: 缩放动画
    2.position: 平移动画
    3.opacity: 淡入淡出动画(改变透明度)
    •在文档中搜素animatable可以找到所有可动画属性
    •如果要关闭默认的动画效果,可以通过动画事务方法实现:

    [CATransaction begin];

    [CATransaction setDisableActions:YES];

    // ...

    [CATransaction commit];

     

    在CALayer上绘图:

    •要在CALayer上绘图,有两种方法:
    1.创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图
    2.设置CALayer的delegate,然后让delegate实现drawLayer:inContext:方法进行绘图
    •注意:
    –不能再将UIView设置为这个CALayer的delegate,因为UIView对象已经是内部层的delegate,再次设置会出问题
    –无论使用哪种方法,都必须向层发送setNeedsDisplay消息,以触发相应绘图方法的调用
     
     
     
    CALayer、UIView以及上下文之间的关系 :
    •当UIView收到setNeedsDisplay消息时,CALayer会准备好一个CGContextRef,然后向它的delegate即UIView,发送消息,并且传入已经准备好的CGContextRef对象。UIView在drawLayer:inContext:方法中会调用自己的drawRect:方法
    •平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由CALayer传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入CALayer的CGContextRef中,然后被拷贝至屏幕
    •CALayer的CGContextRef用的是位图上下文(Bitmap Graphics Context)
     
    本节知识点回顾:
    •每个UIView内部都有一个Layer的属性
    •要具体使用CALayer,需要引入<QuartzCore/QuartzCore.h>
    •CALayer中使用CGColorRef和CGImageRef的数据类型,而不用UIColor和UIImage
    •所有的非Root Layer都存在着隐式动画
    •创建一个CALayer的子类,然后覆盖drawInContext:方法,可以使用Quartz2D API在其中进行绘图
    •在实现核心动画时,本质上是将CALayer中的内容转换成位图,从而便于图形硬件的操纵

     

       

     

  • 相关阅读:
    第3次实践作业
    第2次实践作业
    第1次实践作业
    2019 SDN大作业
    第05组 Beta版本演示
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
    Springboot项目部署到云服务器(Ubuntu 18.04)
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—疫情统计可视化(原型设计)
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4881023.html
Copyright © 2011-2022 走看看