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中的内容转换成位图,从而便于图形硬件的操纵

   

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
分类: iOS高级
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4881023.html,如需转载请自行联系原作者

iOS:CALayer核心动画层相关推荐

  1. iOS学习——核心动画之Layer基础

    iOS学习--核心动画之Layer基础 1.CALayer是什么? CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性,UIView之所以能够显示,就是因为它里面有这 ...

  2. iOS CoreAnimation 核心动画系列博客索引

    学了这些文章能做什么,了解核心动画各个类能做什么,产品有些简单的视图平移.旋转.折叠.抖动的需求,都能搞了 我们写博客的目的是学习研究之后做记录,捎带让别人指教,就是这么简单 博客文章都是对同一个领域 ...

  3. iOS开发核心动画之画图板

    1. 效果图 2. 用一个View来描述画图板,给画图板添加拖动的手势 // 从xib中加载 - (void)awakeFromNib { [self setUpGesture]; } // 代码创建 ...

  4. iOS开发核心动画之Quartz2D绘图

    一. Quartz2D的绘制不同图形 1. 绘图步骤 1> 自定义一个View 2> 在- (void)drawrectangle方法中进行绘图 获取当前上下文 CGContextRef ...

  5. iOS之CALayer与核心动画(一)

    01-CALayer的基本操作. 1.CALayer简介:CALayer我们又称它叫做层.在每个UIView内部都有一个layer这样一个属性.UIView之所以能够显示,就是因为它里面有这个一个层, ...

  6. iOS核心动画以及UIView动画的介绍

    我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些 ...

  7. iOS开发系列--让你的应用“动”起来--超详细的ios核心动画介绍

    概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...

  8. iOS开发UI篇—核心动画(UIView封装动画)

    一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...

  9. Core Animation(核心动画)

    iOS开发UI篇-核心动画简介 一.简单介绍 Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍.也就是说,使用少量 ...

最新文章

  1. docker安装linux桌面系统,Hostwinds云主机 – Docker安装Xfce桌面环境(轻量可视化操作系统)...
  2. 网络编程学习笔记(gai_strerror函数)
  3. pip更新失败_最全Tensorflow2.0 入门教程持续更新
  4. day10T1改错记
  5. delphi 发送html邮件,delphi发送html带附件邮件
  6. python手机解释器_python3
  7. mac地址漂移flapping的前因后果
  8. (转) RabbitMQ学习之远程过程调用(RPC)(java)
  9. python excel 提取特定行_Python之从Excel一列内提取数字
  10. java项目中使用kettle的JNDI连接配置
  11. hashCode()和equals()的若干问题
  12. 鸿鹄论坛oracle资料,鸿鹄论坛_HCNA-Storage (H13-611)题库 v4.0.pdf
  13. 将win10家庭版、教育版系统激活为win10专业版
  14. openwrt下部署adbyby去广告大师 免luci 带自启动,自动开启透明代理
  15. 15个国外最好的电子商务建站程序
  16. vue + scss,文本超过多行需要省略号,不起作用
  17. 安装zsh并修改配置
  18. SUSE配置zypper
  19. 深入理解微服务Maven父子项目构造以及项目打包部署
  20. linux中lv的详细创建流程【化分区-pv-vg-lv创建整套流程】,centos中lv脚本创建vg-pv-lv,-bash: lvs: command not found处理方法

热门文章

  1. websocket+netty实时视频弹幕交互功能(Java版)
  2. 使用List中的remove方法遇到的坑,不信你没有踩过!
  3. 你太菜了,竟然不知道Code Review...
  4. 最新OCR开源神器来了!
  5. 百度第七期智能对话训练营来了!
  6. Kaggle知识点:数据扩增方法
  7. 【廖雪峰python入门笔记】布尔运算和短路计算
  8. 国务院发文!这些专业,将被撤销!
  9. 2021谷歌学术指标出炉:CVPR总榜第4,仅次于Science,ECCV超过ICCV......
  10. Python 3.10来了!!!